【力扣刷题】20. 有效的括号【使用Map优化匹配】

506 阅读2分钟

「这是我参与11月更文挑战的第 14 天,活动详情查看:2021最后一次更文挑战

原题链接

20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

有效字符串需满足:

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

测试用例

示例 1:

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

示例 2:

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

示例 3:

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

参数限制

  • 1 <= s.length <= 104
  • s 仅由括号 ()[]{} 组成

分析

由题已知,由一个字符串,由 ()[]{} 组成,我们需要判断这个字符串中的括号是否成对的出现

最简单的一个思路就是,使用一个栈,遇到左括号,就入栈,遇到一个右括号,就出栈,然后判断两个括号是否成对出现

代码

var isValid = function(s) {
    let arr = [];
    let flag = true;
    s = s.split('').forEach(n => {
        switch (n) {
            case '(':
            case '[':
            case '{':
                arr.push(n);
                break;
            case ')':
                if (arr.pop() != '(') flag = false;
                break;
            case ']':
                if (arr.pop() != '[') flag = false;
                break;
            case '}':
                if (arr.pop() != '{') flag = false;
                break;
        }
    })
    return flag && arr.length == 0;
};

image.png

从运行的效果来看,耗时和内存勉勉强强及格吧,但是代码这里显得非常的冗余

优化

上述的代码,最大的问题就是没法做到左右括号的对应,并快速查找对应的另一半括号,然后就在 case 中走了一层层的条件判断

那么,在继续使用栈辅助的情况下,引入一个 map 类型,来优化括号的查找,在 js 中,object 也可以实现简单的 map 功能

我们定义2个 obj,我们遍历字符的时候,判断左括号是否在 left 中,在的话,直接入栈;不在的话,将他在 right 中转为对应的左括号,并与出栈的符号比较,相等则继续;不等则表示此字符串不是一个有效的

var isValid = function(s) {
    let left = {
            '(': ')',
            '[': ']',
            '{': '}'
        },
        right = {
            ')': '(',
            ']': '[',
            '}': '{'
        }
    let arr = [];
    for (let i = 0; i < s.length; i++) {
        let c = s.charAt(i);
        if (left[c] != undefined) {
            arr.push(c);
        } else {
            if (left[arr.pop()] != right[c]) {
                return false;
            }
        }
    };
    return true && arr.length == 0;
}

image.png

功夫不负有心,这性能直接好上了一大截,耗时和内存已经接近双百


今天的力扣刷题就分享到这里,感谢大家的阅读~