描述
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
示例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,逻辑上很说得通,但是程序会超时。