# 题目描述
# 解题思路
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;
}