5. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
思路:
就是把已经匹配的去除掉,就是像剥洋葱一样 比如 '(){{]}' 先将通过字符串的replace方法 '(){{]}'.replace('()','') 得到 {{]} 如果无法再剥下去就返回false但是他可能存在多组,那就需要使用循环剥除
var isValid = function(s) {
while ( s.includes('()')||s.includes('[]')||s.includes('{}')){
s = s.replace('[]','').replace('()','').replace('{}','')
}
return s.length ? false : true
}
多一句
使用while 一定要注意循环退出的条件,否则你就会发现浏览器卡顿 ,别问我为什么知道
本来以为打遍天下无敌手,谁知一提交 就这 就这
效率这么低,我们再换一个思路:先看效果把
var isValid = function(s) {
if(s.length % 2 === 1){return false}
const stack = [];
for(let i = 0; i < s.length; i+=1){
const c = s[i]
if(c === '{' || c === '[' || c === '('){
stack.push(c)
}else{
const top = stack[stack.length - 1];
if(
(top === '{' && c === '}') ||
(top==='[' && c === ']') ||
(top === '(' && c === ')'))
{
stack.pop()
}else{
return false;
}
}
}
return stack.length === 0
}
有上面的代码就可以看出,通过遍历遇到左括号就压入栈,如果需要遇到右括号就一定会匹配上最新压入栈的左括号
否则 就直接返回false ,如果最后栈为空则 返回true
还是那句老话,效率不是我们追求的目标,但是不同的思维能够给我们带来不同的感受。砥砺前行,勿忘使命