前言
假设,我们需要判断一个字符串中的小括号是否是成对出现的,如果是,代表符合格式,否则,不符合,你需要返回一个布尔类型的值。
分析:主要思路,首先,这肯定是成对出现的,并且其具有顺序性,也就是必须先出现一个左括号,再在其后出现相等数量的右括号,才算是成功的的。
避免误区:只判断成对的数量忽略顺序
代码地址:https://codepen.io/robinson90/pen/XLNKeJ
基本思路
- 将左括号压栈,右括号判断,出现一个右括号,出栈一个左括号,如果发现一旦有右括号,但没有左括号,那么就是不符合的。
- 当遍历完,如果发现,栈内还有元素,那么,说明左括号多,也是不符合的。
优化
所做的一些优化:
- 针对不符合长度为2的字符串,不为字符串类型的直接返回false
- 针对小括号以外的符号做了替换,减少循环的次数
- 针对只有花括号的数组,长度不为偶数,肯定不符合,直接返回
- 循环中,使用栈结构,判断是否需要入栈出栈,循环结束后,判断是否空栈
代码实现
function judgePair(str){
if(typeof(str)!=='string'){
return false
}
if(!str || str.length<=2){
return false
}
let flag = true
let strArr = str.replace(/[^\[()\]]{1}/g,'').split('');
if(strArr.length%2!==0){
return false
}
let strStack = new Stack()
for(let index in strArr){
if(strArr[index] === '('){
strStack.push("(")
}else if(strArr[index] === ")"){
if(strStack.isEmpty()){
flag = false
break;
}else {
strStack.pop()
}
}
}
flag = strStack.isEmpty()
return flag
}