题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串要满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路
- map记录括号匹配规则,左括号为key,右括号为value
- 定义一个栈,遍历字符串,遇到左括号就压栈,遇到右括号,就和栈顶元素比较是否符合map里的规则
- 如果符合,就弹出栈顶元素,否则,不匹配,return false
- 如果遍历字符串,没有遇到栈顶与当前右括号不匹配的情况,并且遍历完字符串后,栈内 所有左括号都出栈了,return true
代码
var isValid = function(s) {
//使用栈和map实现
//遇到左括号入栈,遇到右括号就把栈顶左括号取出
//判断是否匹配
//匹配则继续,否则false
let stack=[]
let map=new Map()
map.set('(',')')
map.set('{','}')
map.set('[',']')
for(let i=0;i<s.length;i++){
//遇到左括号
if(map.has(s[i])){
stack.push(s[i])
}else{
//遇到右括号,取出栈顶元素,
//判断
if(s[i]===map.get(stack[stack.length-1])){
//匹配成功,取出栈顶元素
stack.pop()
}else{
return false
}
}
}
return stack.length==0
};