力扣题解:有效的括号

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1.描述

20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。  

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

2.分析

使用map建立映射关系:左括号为key,右括号为value
使用辅助栈,利用先进后出的特点
遍历字符串,如果mapping中有此key(说明这是个左括号),获取该key对应的value,放入栈中,如果没有(说明是右括号),出栈并与当前值做对比,如果相等则配对成功
遍历结束时检查栈是否为空,如果不为空说明还有未配对的左括号
注意栈存储的是右括号,并不是实际意义的左括号进行配对,因为配对关系已经通过mapping建立了

3.AC代码

var isValid = function (s) {
    //建立映射关系:左括号为key,右括号为value
    const mapping = new Map();
    mapping.set("(", ")");
    mapping.set("[", "]");
    mapping.set("{", "}");
    //辅助栈
    const stack = [];
    //遍历字符串
    for (let i = 0; i < s.length; i++) {
        //如果mapping中有此key(说明这是个左括号)
        if (mapping.has(s[i])) {
            //获取该key对应的value,放入栈中
            stack.push(mapping.get(s[i]));
        } else {//如果没有,说明是右括号
            //出栈,与当前值做对比
            if (stack.pop() !== s[i]) {
                return false;
            }
        }
    }
    //循环结束时,如果stack不为空,说明有左括号没配对
    return stack.length == 0 ? true : false;
}

参考

执行2ms,运用ASCII值判断左右括号是否匹配 - 有效的括号 - 力扣(LeetCode)

栈的先进后出,map 思路: 栈保存左括号,map-key保存右括号,遇到右括号判断是否配对并出栈 - 有效的括号 - 力扣(LeetCode)