Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 8-有效括号.mdx
目录
题目描述思路代码
986 字
约 3 分钟
更新于 2026/08/20

有效的括号

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路:

括号必须用相同的有括号闭合,所以可以利用这一特性,声明一个 stack ,循环传入的字符串,如果是 ['(', '[', '{'] 其中的一个,就存入栈中,如果不是,则弹出 stack 最后一个元素,看时候能对应上,如果能对应上,进行下一次循环,如果对应不上直接返回 false .

代码
const isValid = (s) => {
        if(s.length % 2 !== 0 ) return false; // 如果传入字符串长度不是偶数,直接返回 false
        const map = new Map([ // 建立对应关系
            [')', '('],
            [']', '['],
            ['}', '{'],
        ])
        const stack = [];
 
        for (let k of s) {
            if (['(', '[', '{'].includes(k)) { //如果是左括号,先存起来
                stack.push(k);
                continue;
            } else if (stack.length > 0 && map.get(k) === stack.pop()) {
                // 走到这里,说明当前的 k 是右括号,取出与之对应的左括号 和 stack 中存的最后一个左括号进行对比。
                // 如果相等,则证明括号能匹配上,进行下一次循环
                continue;
            } else { // 如果匹配不上,说明括号不成对,直接返回 false
                return false
            }
        }
        return stack.length === 0
    }