20.括号匹配

/*
给定一个只包括 '(',')','{','}','[',']'的字符串 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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值