前言

假设,我们需要判断一个字符串中的小括号是否是成对出现的,如果是,代表符合格式,否则,不符合,你需要返回一个布尔类型的值。

分析:主要思路,首先,这肯定是成对出现的,并且其具有顺序性,也就是必须先出现一个左括号,再在其后出现相等数量的右括号,才算是成功的的。

避免误区:只判断成对的数量忽略顺序

代码地址:https://codepen.io/robinson90/pen/XLNKeJ

基本思路

  • 将左括号压栈,右括号判断,出现一个右括号,出栈一个左括号,如果发现一旦有右括号,但没有左括号,那么就是不符合的。
  • 当遍历完,如果发现,栈内还有元素,那么,说明左括号多,也是不符合的。

优化

所做的一些优化:

  • 针对不符合长度为2的字符串,不为字符串类型的直接返回false
  • 针对小括号以外的符号做了替换,减少循环的次数
  • 针对只有花括号的数组,长度不为偶数,肯定不符合,直接返回
  • 循环中,使用栈结构,判断是否需要入栈出栈,循环结束后,判断是否空栈

代码实现

  1. function judgePair(str){
  2. if(typeof(str)!=='string'){
  3. return false
  4. }
  5. if(!str || str.length<=2){
  6. return false
  7. }
  8. let flag = true
  9. let strArr = str.replace(/[^\[()\]]{1}/g,'').split('');
  10. if(strArr.length%2!==0){
  11. return false
  12. }
  13. let strStack = new Stack()
  14. for(let index in strArr){
  15. if(strArr[index] === '('){
  16. strStack.push("(")
  17. }else if(strArr[index] === ")"){
  18. if(strStack.isEmpty()){
  19. flag = false
  20. break;
  21. }else {
  22. strStack.pop()
  23. }
  24. }
  25. }
  26. flag = strStack.isEmpty()
  27. return flag
  28. }