一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "([)]"
输出:false
示例 4:
输入:s = "{[]}"
输出:true
二、思路分析:
栈的解题思路
审题后获得的信息是,有效字符串匹配规则:先出现的括号后匹配。因此我们便想到先进后出的栈。借用栈的数据结构,在遍历字符串的时候,匹配到左括号时,就把对应的右括号压入栈;当匹配到右括号时判断和栈顶弹出的元素是否相同即可,是有效字符串的话,最后栈是清空的。
注意有效字符串的长度一定是偶数,如果是奇数,我们可以直接返回false,省去后续不必要的遍历计算。
三、AC 代码:
var isValid = function(s) {
const n = s.length;
if (n % 2 === 1) return false;
const map = {
'(': ')',
'[': ']',
'{': '}'
};
let stack = [];
let top;
for(var char of s) {
let value;
if((value = map[char])) {
stack.push(value)
}else{
top = stack.pop()
if(top !== char) {
return false;
}
}
}
return !stack.length;
};
四、总结:
有效的括号,是高频出现的算法考点。这题到底可以考察我们哪些功力呢?
经过思考后,我得出了这样的答案:
- 这题首先考察做题者的对基本数据结构是否都了解其特点,能否在具体的使用场景选择合适的数据结构解决问题;
- 其次考察做题者能否仔细观察输入数据,判断输入长度、边界,对特殊情况进行判断,减少不必要的计算。
本文正在参与「掘金 3 月闯关活动」,点击查看活动详情