NC52 括号序列

NC52 括号序列
在这里插入图片描述

方法一:借助辅助栈——左括号入栈,右括号出栈

核心思想:
每次遇到’(’,’{’,’[‘这三种字符的时候,将字符入栈stk;而每次遇到’)’,’}’,’]‘这三种字符的时候则让对应的匹配字符出栈。具体规则如下:
1)引入辅助栈stk,遍历字符串,每次遇到’(’,’{’,’[‘字符的时候将字符入栈stk
2)当遇到’)’,’}’,’]'字符的时候,则检查栈是否空,且顶元素是否为匹配元素(如{和}匹配等),如果栈空或者栈顶元素不为匹配元素则括号序列不合法
3)当栈非空,且栈顶元素为匹配元素,则栈顶元素出栈。
4)循环匹配字符串,直到每次字符处理完
5)检查栈stk是否为空,栈为空则序列合法,否则不合法(当括号以正确顺序关闭时则最后的栈为空)
在这里插入图片描述

/**
  * 
  * @param s string字符串 
  * @return bool布尔型
  */
function isValid( s ) {
    // write code here
    let arr = [];
    for(let i=0;i<s.length;i++){
        switch(s[i]){
            case '(':
            case '[':
            case '{':
                arr.push(s[i]);   //当前字符为'(','{','['时,元素入栈
                break;
            case ')':
                if(arr.length===0 || arr[arr.length-1] !== '(')
                    return false;
                arr.pop();
                break;
            case ']':
                if(arr.length===0 || arr[arr.length-1] !== '[')
                    return false;
                arr.pop();
                break;
            case '}':
                if(arr.length===0 || arr[arr.length-1] !== '{')
                    return false;
                arr.pop();
                break;
        }
    }
    return arr.length===0 ? true : false;
}
module.exports = {
    isValid : isValid
};
方法二:借助辅助栈——右括号入栈(推荐)

核心思想

1 借助辅助栈,当遇到’(’,’[’,’{‘这三种字符的时候则让对应的匹配字符入栈(分别对应’)’,’]’,’}’),
2. 当出现的字符不是’(’,’[’,’{'这三种字符时,则先判断栈是否为空或者当前字符是否与栈顶元素一样,当栈空或者当前字符与栈顶字符不一样时,则括号序列不合法,直接返回;否则栈顶元素出栈。
3. 遍历字符串直到所有元素遍历完成。最后判断栈是否为空,不为空则括号序列不合法;否则为合法序列。

/**
  * 
  * @param s string字符串 
  * @return bool布尔型
  */
function isValid( s ) {
    // write code here
    let stk = [];
    for(let i=0;i<s.length;i++){
        if(s[i] == '(')           //当为(字符时,将匹配字符入栈,下同
            stk.push(')');
        else if(s[i] == '[')
            stk.push(']');
        else if(s[i] == '{')
            stk.push('}');
        else{                //当字符不是'(','[','{'这三种字符时,则判断当前字符是否与栈顶元素一样(栈非空时)
            if(stk.length===0 || s[i] != stk[stk.length-1])
                return false;
            stk.pop();
        }
    }
    return stk.length===0 ? true : false;
}
module.exports = {
    isValid : isValid
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值