原理
类似的匹配问题用栈都是十分方便的
每当遍历到一个左符号的时候,就往栈中添加一个对应的右符号;当遍历到一个右符号的时候,就和栈顶元素比较,具体有三种情况,
- 左符号多了(字符串遍历完毕,栈不为空)
- 右符号多了(字符串还没有遍历完毕,栈为空了)
- 左右符号不匹配(当遍历到一个右符号的时候,和栈顶元素不一样)
实现(JS)
力扣 20. 有效的括号
var isValid = function(s) {
let stack = []
for(let c of s) {
if(c === '(') {
stack.push(')')
}else if(c === '[') {
stack.push(']')
}else if(c === '{') {
stack.push('}')
}else{
// 匹配到右符号
if(stack.length === 0) {
// 右符号多了(字符串还没有遍历完毕,栈为空了)
return false
}
let top = stack[stack.length-1]
if(c === top) {
stack.pop()
}else {
// 左右符号不匹配(当遍历到一个右符号的时候,和栈顶元素不一样)
return false
}
}
}
if(stack.length !== 0) {
// 左符号多了(字符串遍历完毕,栈不为空)
return false
}
return true
};