同一算法不同的解法(有效的括号)

68 阅读1分钟

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 一定要注意循环退出的条件,否则你就会发现浏览器卡顿 ,别问我为什么知道

本来以为打遍天下无敌手,谁知一提交 就这 就这

image-20220920163257542.png

效率这么低,我们再换一个思路:先看效果把

image-20220920172155268.png

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

还是那句老话,效率不是我们追求的目标,但是不同的思维能够给我们带来不同的感受。砥砺前行,勿忘使命