首页 > web前端 > js教程 > 正文

JS括号匹配问题

高洛峰
发布: 2016-10-15 16:31:49
原创
1960人浏览过

在codewars上做了一道括号匹配的题目。

题目

判断字符串中的{}、[]、()三种括号是否匹配,需要考虑嵌套的情况。

例子:

validBraces("(){}[]")     // true 
validBraces("(}")         // false 
validBraces("[(])")       // false 
validBraces("([{}])")     // true
登录后复制

Solution

这个问题的最根本只有两种情况,一种是并列的,即没有嵌套的情况,如()[]{};另一种情况就是嵌套的情况,如{[()]}。第一种情况是比较简单的,有难度的是第二种情况。存在嵌套的情况的解决方法,是首先匹配最里面的括号对,即我们常说的从内部开始瓦解。

第一种方法:

function validBraces(braces){
  while(/\(\)|\[\]|\{\}/g.test(braces)){
    braces = braces.replace(/\(\)|\[\]|\{\}/g,"")
  }
  return !braces.length;
}
登录后复制

这种方法,查找成对的括号,然后将成对相邻的括号替换成空字符串,也就是说删除。最后判断字符串的长度是否为0。是,则表示完全匹配,否则,比匹配。
其实,这种方案就是典型的“从内部开始瓦解”。我们以{[()]}为例,你观察一下,现在只有最里面的()才是成对且相邻的,当把()替换成空字符串之后,[]变成了成对且相邻的,然后再将其替换成空字符串。就这样一直循环地查找,直到再也找不到成对且相邻的括号为止。

第二种方法:

function validBraces(braces){
  let leftBraReg = /[\(\{\[]/, 
    // 栈
      stack = [],
      bracket, rightBracket
  braces = braces.split('')
  for(bracket of braces) {
    if(leftBraReg.test(bracket)) {
      stack.push(bracket)
    }
    else {
      switch (bracket) {
          case ')':
          rightBracket = stack.pop()
          if(rightBracket !=='(') {
              return false
          }
          break
        case ']':
          rightBracket = stack.pop()
          if(rightBracket !=='[') {
              return false
          }
          break
        case '}':
          rightBracket = stack.pop()
          if(rightBracket !=='{') {
              return false
          }
          break
      }
    }
  }
  return stack.length === 0 ? true : false
}
登录后复制

这种方法,是将左半边括号,即(、[、{存入栈stack中,当遍历到右半边括号,即)、]、}的时候,stack执行出栈操作,然后将出栈的左半边括号与遍历到的有半边括号匹配,看是否为与其相匹配的另半边括号。如果遍历完了,则判断栈的长度,为0,则匹配,否则,比匹配。
我们同样以{[()]}为例,前三项,即{、[、(入栈,当遍历到)的时候,位于栈顶的'('后出栈与)比较,看是否匹配。后面的]、}也是一样道理。

结语

现在渐渐发现,数据结构和正则表达式非常重要(这里的解决方法就分别用到了),虽然平时用得少,到一道有应用场景,你就会发现数据结构和正则表达式的强大了。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号