前端Leetcode系列|20. 有效的括号

367 阅读2分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

这是力扣系列第3篇,今天来和小伙伴们一起打卡力扣第20题:有效的括号。

一、题目描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

拿到这个题目,首先可以考虑一个绝对不可能的条件,那就是传入的字符串长度为单数,所以只有判断为单数直接返回false即可。

当满足传入的长度不为单数的情况下,我们就可以继续往下进行了。我们定义一个对象,使对象的左括号为键、右括号为值,做一个映射。再定义一个空数组做栈。

接着我们来遍历这个传入的字符串,依次判断每一项是否为左括号,如果是,push到栈中,继续向后判断。如果判断不是左括号,则取出栈中最后一个,判断与此值是否能匹配成功,若可以匹配,则继续循环;若匹配失败,则直接返回false。

在循环体外面,我们再判断栈的长度是否为空,若为空代表全部匹配成功,返回true,否则代表有匹配失败,返回false即可。

三、JavaScript实现代码

/**
 * @param {string} s 要匹配括号的字符串
 * @return {boolean}
 */
var isValid = function (s) {
    if (s.length % 2 === 1) {
        return false;
    }
    const map = {
        "(": ")",
        "[": "]",
        "{": "}",
    };
    const stack = [];
    for (const x of s) {
        if (x in map) {
            stack.push(x);
            continue;
        };
        if (map[stack.pop()] !== x) return false;
    }
    return !stack.length;
};

四、总结

前端漫漫长途,我们都在路上,希望可以和小伙伴们一起交流,一起进步。持续更新ing.....

前往Leetcode专栏系列文章,查看解锁更多内容。