题目:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: "()" 输出: true
输入: "(]" 输出: false
题解:
需要遍历时,是从左往右遍历,左括号需要等着右括号匹配,先把左括号存起来,若是右括号,判断是否匹配
step1:对字符串进行处理转换成数组,split,这样避免字符串中有空字符
step2:判断数组的长度,若为奇数,则返回false
step3:定义一个数组,用来存储等待匹配的左括号
step4:定义一个map,用来建立括号的映射关系
step5:遍历数组,若是左括号,则存入数组中,若是右括号,则取出数组栈顶元素
step6:判断当前栈顶元素与当前右括号是否匹配,若匹配,栈顶元素出栈,则进行下一轮
step7:若不匹配,则返回false
step8:循环结束,判断数组栈中是否都已经匹配完,若未匹配完,返回false
step9:返回true
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
//对字符串进行处理,排除空字符对干扰
let arr = s.split('')
let len = arr.length
//定义数组,用来存储需要匹配的左括号
let stack = []
//定义一个map结构,用来建立括号的映射关系
let map = new Map()
map.set("(",")")
map.set("[","]")
map.set("{","}")
//若字符串为奇数,则返回false
if(len % 2 != 0){
return false
}
//循环遍历数组
for(let i=0;i<len;i++){
//如果为左括号,则入栈
if(map.has(arr[i])){
stack.push(arr[i])
}else{
//判断栈的长度,当前是否有可以匹配的元素,没有返回true
if(stack.length === 0){
return false
}else {
//判断当前栈顶元素,与所遍历的数组是否匹配
let top = stack[stack.length-1]
if(arr[i] === map.get(top)){
//匹配则弹出栈顶元素
stack.pop()
}else {
//不匹配,则返回false
return false
}
}
}
}
//进一步判断当前栈是否有待匹配元素
if(stack.length > 0) return false
else return true
};