JavaScript 字符串:匹配括号序列【思路与知识点总结】

描述
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。

示例1
输入:“[(])” 返回值:false

示例2
输入:"[](([[]]){}{[]}([]))" 返回值:true

思路一:将字符串循环替换()、[]、{},若替换后字符串的长度仍大于0,则证明有没有匹配的括号,结果为false
先进行特殊情况处理:如果字符串长度为1或者字符串的长度为奇数,则直接返回false

function isValid( s ) {
    if(s.length==1) return false;
    if(s.length%2==1) return false;
    let count=0;
    let length=s.length;
    while(count<length/2){
        s=s.replace("()","").replace("[]","").replace("{}","");
        count++;
    }
    if(s.length>0){
        return false;
    }else 
        return true;
}

总结:本题所用知识点
1. 字符串获取长度str.length

2. String对象中的replace()方法
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

stringObject.replace(regexp/substr,replacement)

参数说明:
regexp/substr:必需。规定子字符串或要替换的模式的 RegExp 对象。
请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
replacement:必需。一个字符串值。规定了替换文本或生成替换文本的函数。

注意!replace替换只能替换第一个匹配到的

//替换字符串
//注意!replace替换只能替换第一个匹配到的
let str="ababababab";
let replacestr=str.replace("a","c");
console.log(replacestr);//cbabababab
//匹配正则表达式
//通过g可以匹配全局,而不是第一个,如果没有g,则还是匹配第一个
let str="ababababab";
let replacestr=str.replace(/a/g,"c");
console.log(replacestr);//cbcbcbcbcb

需要注意的地方:
1. 程序第7行

s=s.replace("()","").replace("[]","").replace("{}","");

s替换完之后,要赋值给s!(这个bug找了好久…不细心…)

2. 程序第6行的循环条件
为什么要在程序第5行定义出let length=s.length;
这里定义字符串的长度,是为了要一个定值,好去做循环条件。循环条件很重要,不好的循环条件会使得程序超时而不能AC。如果在此处不获取字符串初始长度这个定值,那么在后面的循环替换各种括号的过程中,字符串的长度会发生变化,导致循环条件中的字符串长度就会不断变化,进而导致循环条件出现问题,结果出现bug。
关于这道题目,我们循环输出三个值来观察:

    while(count<length/2){
        s=s.replace("()","").replace("[]","").replace("{}","");
        count++;
        console.log(s.length)
        console.log(count,s)
    }

其中:s.length是动态的字符串长度;count是计数器;s是剩余字符串
以示例2为例"[](([[]]){}{[]}([]))"
在这里插入图片描述
这里我们的循环条件是count<length/2(即最劣环境,每次仅替换一对括号,减少两个字符串长度)
如果将循环条件改为s.length>0,逻辑上很说得通,但是程序会超时。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值