/*
给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
思路:
需要配对,遍历数组的同时,将左括号存储在栈内,
每次用当前的右括号和栈顶元素匹配,匹配成功,指针后移,失败结束;
最后栈不空失败,栈空成功
*/
const type={
left_s: '(',
left_m: '[',
left_l: '{',
right_s: ')',
right_m: ']',
right_l: '}',
}
/*
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
var stack=[], cur = 0,tmp;
while(cur<s.length){
if(s[cur]===type.left_l||s[cur]===type.left_s||s[cur]===type.left_m){
stack.push(s[cur]);
}else {
if(!stack.length){
return false;
}
// 自己编码时忘记这个if判断了,因为空数组pop返回的是undefined,所以也能正确通过
// 但确实是忘记考虑s='}{'这种一开始就是右括号的情况,这种通过if在一开始就可以被排除,不需要遍历完才确定
tmp=stack.pop();
console.log(tmp);
if((s[cur]===type.right_s&&tmp!==type.left_s)||(s[cur]===type.right_m&&tmp!==type.left_m)||(s[cur]===type.right_l&&tmp!==type.left_l)){
return false
}
}
cur++;
}
if(stack.length){
return false;
}
return true;
}
var s='}{';
console.log(isValid(s));
11-04
296