给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
解题思路: 第一种:用repace方法,闭合才有效,也就是最里边的也要闭合,那就把最里边的括号取代为空
var isValid = function(s) {
while(s.length){
let temp =s;
s = s.replace('()','');
s = s.replace('[]','');
s = s.replace('{}','');
if(s==temp)return false
}
return true
};
第二种:栈思想 括号都是要闭合的,也就是说遇到第一个右括号时,必定左边就是对应的左括号,也就是说把遇到的左括号都放进栈里,然后遇到右括号时取出栈顶的元素匹配 如"{[()]}"遇到{[(放入栈内,然后遇到)与栈顶匹配,栈顶也就是最后一个进栈的元素(,然后把栈的最后一个元素删掉
var isValid = function(s) {
let a = [];
let res=0;
for(let i=0;i<s.length;i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
a.push(s[i]);
res++;
}
else if(s[i]==')'){
if(a[a.length-1]=='('){
a.pop();
res--;
}
else return false
}
else if(s[i]=='}'){
if(a[a.length-1]=='{'){
a.pop();
res--;
}else return false
}
else if(s[i]==']'){
if(a[a.length-1]=='['){
a.pop();
res--;
}else return false
}
}
return res==0
};
var isValid = function(s) {
let map = {
"{":"}",
"[":"]",
"(":")",
}
let leftArr = [];
for(let ch of s){
if(ch in map){
leftArr.push(ch)
}else{
if(ch!=map[leftArr.pop()]){
return false
}
}
}
return !leftArr.length
};
循环s字符串,ch in map 的意思是循环map的键值,也就是遇到左括号时,放进数组,当开始遇到右括号时,用pop()弹出栈顶的元素与与之比对,若是不相等,就ruturn false (leftArr.pop()为左括号,map[key]=value,也就是右括号),当程序走完时,left的length长度应该为0,若不为0则没闭合(当length=0 时,!leftArr.length为turn,当length>0 时,!leftArr.length为false)