Leetcode每日一题-有效的括号

1,350 阅读1分钟

题目描述

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

示例:

输入: "([)]" //false
输入: "{[]}" //true

题解

方法一:暴力消括号

关于有效括号表达式的一个有趣属性是有效表达式的子表达式也应该是有效表达式。

因此从整体表达式中一次删除一个较小的表达式,因为这是一个有效的表达式,最后剩留下一个空字符串。

过程:找到最内层的括号对,消去,重复此过程,若存在无法消去的字符则说明字符串无效。

var isValid = function (s) {
    while (s.length) {
        var temp = s;
        s = s.replace('()', '');
        s = s.replace('[]', '');
        s = s.replace('{}', '');
        if (s == temp) return false
    }
    return true;
};

方法二:使用栈

过程:

遍历并处理表达式的每个括号

  • 如果遇到开括号,将其推到栈(数组)上。
  • 如果遇到一个闭括号,检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么将它从栈中弹出(pop())并继续处理,否则为无效字符串。
  • 若最终数组为空,表示括号已全部匹配完,字符串有效。
var isValid = function (s) {
    var map = {
        "(": ")",
        "[": "]",
        "{": "}"
    }
    var leftArr = []
    for (var ch of s){
        if (ch in map) leftArr.push(ch); //为左括号时,顺序保存
        else { //为右括号时,与数组末位匹配
            if(ch != map[leftArr.pop()]) return false;
        }
    }
    return !leftArr.length //防止全部为左括号
};

参考:Leetcode题解