这是我参与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专栏系列文章,查看解锁更多内容。