leetCode 22.有效的括号

210 阅读2分钟

前言

思考了许久用了暴力解法,看了看官方解法觉得特别有意思

题目简介

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

示例

输入: "()"       输出: true

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

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

题解

这题的解题思路相当于是一维的连连看游戏,不断地消除相邻的成对左右括号,如果最后全部消除,就是有效的括号,反之无效。所以可以使用「栈」这一数据结构来解决

var isValid = function(s) {
    const n = s.length;
    //这里如果长度为奇数直接返回false就行了 奇数不可能两两配对的
    if (n % 2 === 1) {
        return false;
    }
    const pairs = new Map([
        [')''('],
        [']''['],
        ['}''{']
    ]);
    const stk = [];
    s.split('').forEach(ch => {
        if (pairs.has(ch)) {
            //没有匹配成功
            if (!stk.length || stk[stk.length - 1] !== pairs.get(ch)) {
                return false;
            }
            //配对成功则删除数组最后一位
            stk.pop();
        } 
        else {
            //末尾添加 因为后出现的括号最先匹配
            stk.push(ch);
        }
    });
    //最终数组为空就证明所有的都配对成功
    return !stk.length;
};