题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
题目来源:leetCode 20. 有效的括号
JavaScript的入栈是用数组的 push() 来模拟的;
出站是 pop() 模拟,会删除数组里出站的元素。
可以用栈的空间长度为0判断出栈是否结束。
栈的特点是 先进后出 ,出口只有栈顶。
思路是:
遇到符号的左半边都放放进去栈里,直到遇到符号的右半边开始,出栈一个对比一下与当前的字符是否成一对,不是就直接return false。
先以一组正确的为例: “()[]{}”
-
开始循环字符串,拿到第一个 ( ,属于左半边字符,放入栈:stack.push( ‘(’ )
-
第二个字符 ),此时遇到右半边字符,我们就将栈里数据出栈。
stack.pop() 拿到了 ( ,判断这两个字符串是一对。 -
第三个字符 [ , 放进栈里,stack.push(’[’):
-
第四个字符是 ‘ ] ’, 遇到右半边的字符,所以又开始出栈 stack.pop(),
得到 ‘[’, 判断他们两个是一对,所以继续; -
第五个字符是 ‘{‘,是括号的左半边,所以入栈 ,stack.push(’ { ');
-
第六个字符是 ‘}’, 是括号的右半边,此时将stack出栈一位,得到 '{'
对比发现是匹配的括号,此时字符串遍历完毕,并且栈里没有剩余没有匹配的字符串,返回 true.
接下来以一组错误的为例: “([)]”
- 字符串开始遍历,第一位是 ’ ( ',括号类型的左半边,放入栈中,
- 第二个字符串是 ‘ [ ’,也是左半边,继续放入栈中,
- 第三个字符是 ’ ) ',遇到右半边就开始出栈进行对比,出栈得到 ‘ [ ’,
发现两个字符不是一对完成的括号,即返回 false,不用后续比较了。
完整代码:
var isValid = function(s) {
let stack = [];
let temp= {
'[':']',
'(':')',
'{':'}',
}
if(s.length < 2) return false
for(let i= 0; i< s.length; i++) {
if(![']','}',')'].includes(s[i])) {
stack.push(s[i])
}else if(temp[stack.pop()] !== s[i]) {
return false
}
}
if(stack.length>0) return false
return true
};