消消乐的方式解决字符串配对问题

1,059 阅读1分钟

# 题目描述

leetcode-cn.com/problems/va…

# 解题思路

1、看到这道题首先想到的是以消消乐的思路来解决;
2、循环消除相邻可以配对成功的括号;
3、递归直到没有任何可以消除的对象;
4、若全部消除则返回true,否则返回false;

# 优缺点

1、思路比较简单;
2、时间复杂度比较高;

# 代码实现

const map = {  
    '(': ')',  
    '[': ']',  
    '{': '}'
}
var isValid = function(s){  
    if(!s) return true;  
    if(s.length%2) return false;  
    s = typeof(s)==='string'? s.split('') : s;  
    let exist = false;  
    for(let i=0;i<s.length-1;i++){    
        if(map[s[i]]===s[i+1]) {      
            exist = true;      
            s[i] = s[i+1] = 'K';    
        }  
    }  
    s = s.filter(item => item!=='K');  
    if(!s.length) return true;  
    if(!exist && s.length) return false;  
    return isValid(s);
}

# 方法二

1、这个是官方给出的解法确实比较好,我也来实现一下;
2、思路循环遇到左括号存到一个声明好的栈中(采用后存先取的原则);
3、遇到右括号,匹配栈中最后一位,匹配成功则消除这一对,匹配不成功则返回失败
4、循环完成,栈中没有带匹配项则整个匹配成功;

# 优缺点

1、理解起来稍微难一点;
2、时间复杂度为O(n);

# 代码实现

const map = {  
    '(': ')',  
    '[': ']',  
    '{': '}'
}
var isValid = function(s){  
    if(!s) return true;  
    if(s.length%2) return false;  
    const left = ['(','[','{'];  
    const stack = [];  
    for(let i=0; i<s.length; i++) {    
        if(left.includes(s[i])){      
            if(s.indexOf(map[s[i]])<0) return false;      
            stack.push(s[i]);    
        }else if(map[stack.pop()] !== s[i]) {      
            return false;    
        }  
    }  
    if(stack.length) return false;  
    return true;
}