解法一(栈):
/**
*
* @param s string字符串
* @return bool布尔型
*/
function isValid( s ) {
let stack = []
if(s.length === 1){ // 如果字符串就一个字符,必然不会有效,直接返回false
return false
}
for(let i = 0; i < s.length ; i++){ //遍历字符串
if(s[i] === '(' || s[i] === '{' || s[i] === '['){ //如果是左括号,就入栈
stack.push(s[i])
}else if(stack.length > 0){ //如果是右括号,先判断栈是否为空,为空说明没有左括号相匹配,返回false
if(s[i] === ')' && stack[stack.length-1] === '('){ //如果栈不空,查找栈顶是否和现在的括号相匹配
stack.pop() //匹配的话,就把对应的左括号出栈
continue //然后跳过本次循环,不再判断下面的if
}
if(s[i] === '}' && stack[stack.length-1] === '{'){
stack.pop()
continue
}
if(s[i] === ']' && stack[stack.length-1] === '['){
stack.pop()
continue
} else {return false} //如果三个括号都配不上,返回false
} else {return false} //如果是右括号但是栈为空,返回flase
}
if(stack.length != 0 ){ //如果遍历结束了,但是栈非空,说明左括号多出来了,返回false
return false
}
return true //不然返回true
}
module.exports = {
isValid : isValid
};
运行时间 96ms
占用内存 8584KB
主要思路:
- 左括号通通入栈
- 如果是右括号,判断栈是否为空,空返回false,非空要判断栈顶是否和当前括号匹配,不匹配也不对
- 用continue可以大大节约时间,不用三个右括号都判断一遍
- 循环结束了要检查栈是否为空,是否有左括号落单