leetcode-20-有效括号

113 阅读1分钟

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

有效字符串需满足:

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

示例:

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

知识点:

  • Map

代码:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    let n = s.length;
    // 1.判断该字符串是否为偶数,奇数肯定无法对应,为无效字符串
    if (n % 2 === 1) return false;

    // 2.新建一个map对象实现括号的对应关系,以及一个栈stack 
    let map = new Map([
        [")", "("],
        ["]", "["],
        ["}", "{"],
    ])
    let stack = [];

    for (ch of s) {
        // 3.循环字符串判断Map是否含有该元素
        // 3.1 如果有
        if (map.has(ch)) {
            // 以下两个条件是无法产生对应关系的
            // a.stack的长度为空
            // b.当前匹配的字符串的值与stack的最后一个元素不相等
            if (!stack.length || stack[stack.length - 1] !== map.get(ch)) {
                return false;
            }
            // 3.2 产生对应关系,删除最后一个元素
            stack.pop();
        } else {
            // 3.3 如果没找到,那么就直接入栈
            stack.push(ch);
        }
    }

    // 4.最后返回栈的长度,如果为0那么就都是对应的关系消除了,反之则不是;
    return stack.length === 0;
};