【路飞】算法与数据结构-有效的括号

263 阅读1分钟

LeetCode:地址

题目要求

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成
思路
  1. 有效括号字符串的长度,一定是偶数!
  2. 右括号前面,必须是相对应的左括号,才能抵消!
  3. 右括号前面,不是对应的左括号,那么该字符串,一定不是有效的括号!
代码
// 解法一
let isValid = function(s) {
    let stack = [], length = s.length;
    if(length % 2) return false;
    for(let item of s){
        switch(item){
            case "{":
            case "[":
            case "(":
                stack.push(item);
                break;
            case "}":
                if(stack.pop() !== "{") return false;
                break;
            case "]":
                if(stack.pop() !== "[") return false;
                break;
            case ")":
                if(stack.pop() !== "(") return false;
                break;
        }
    }
    return !stack.length;
};

// 解法二
var isValid = function(s) {
    s = s.split('');
    let sl = s.length;
    if (sl % 2) return false;
    let map = new Map([[')', '('], [']', '['], ['}', '{']]);
    let stack = [];
    for(let i of s){
        if (map.get(i)) {
            if (stack[stack.length - 1] !== map.get(i)) return false;
            else stack.pop();
        } else {
            stack.push(i);
        }
    }
    return !stack.length;
};