javascript - 平衡字符 Javascript

标签 javascript

我有一个代码 war 练习,其中我必须编写一段代码来验证提供的字符串是否平衡。例如,我需要确保当遇到开始 "(" 时,我必须确保还存在结束 ")" 标记。但是,在此代码中,第二个字符串将包含第一个字符串要查找和检查的括号或字符。

这是我的代码:

function isBalanced(s, caps) {
  let strArr = s.split("");
  let capsArr = caps.split("");

  let pairsCaps = caps.match(/.{1,2}/g);

  for(let i = 0; i < strArr.length; i++) {

    for (let m = 0; m < pairsCaps.length; m++){
    if(strArr[i] == pairsCaps[m][0] && strArr[strArr.length -1] == pairsCaps[m][1]) {
      return true;
    } else {
      return false;
    }
  }

  }
}
console.log(isBalanced("Sensei says -yes-!", "--"));

但是,当我运行一些示例测试时,我发现虽然它适用于 isBalanced("(Sensei said yes!)", "()")isBalanced("(Sensei [says] yes!)", "()[]"),当 isBalanced("Sensei said -yes) 中存在 -- 时,代码无法正常工作-!", "--"),当它应该返回 true 时,它却返回 false

我查看了我的代码,但无法缩小问题范围。请帮忙...?

最佳答案

当前,当找到开始标记时,您的代码仅检查字符串中的最后一个字符是否是匹配的结束标记:

if(strArr[i] == pairsCaps[m][0] && strArr[strArr.length -1] == pairsCaps[m][1]) {

这就像说“如果迭代的字符是 (,请检查最后一个字符是否是 )”。

一种选择是创建一堆当前打开的标签。当找到开始标签时,将其压入标签栈;当您找到结束标签时,如果匹配,请从标签堆栈中删除顶部项目。 (如果不匹配,则标签不平衡)。如果堆栈末尾有任何元素,则标签不平衡。否则,它是平衡的。

另一个选项是构造一个正则表达式,它匹配开始标记,后跟非标记字符,最后跟结束标记。重复将匹配子字符串替换为空字符串,直到模式不再匹配,然后检查最终结果是否为空字符串:

// https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
const escape = s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');

function isBalanced(s, caps) {
  const openTags = [];
  const closeTags = [];
  for (const [index, char] of [...caps].entries()) {
    (index % 2 ? closeTags : openTags).push(char);
  }
  const pattern = new RegExp(
    openTags
      .map((openTag, i) => `${escape(openTag)}[^${escape(caps)}]*${escape(closeTags[i])}`)
      .join('|')
  );
  let str = s;
  let lastStr;
  while (lastStr !== str) {
    lastStr = str;
    str = str.replace(pattern, '');
  }
  return str.replace(new RegExp(`[^${caps}]*`), '') === '';
}
console.log(isBalanced("Sensei says -yes-!", "--"));
console.log(isBalanced("(Sensei says yes!)", "()"))
console.log(isBalanced("(Sensei [says] yes!)", "()[]"));
console.log(isBalanced("(Sensei [says] yes!", "()[]"));
console.log(isBalanced("Sensei [says] yes!)", "()[]"));

关于javascript - 平衡字符 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59123811/

相关文章:

javascript - 如何使用 JavaScript 模拟鼠标点击?

javascript - PyQt4 : Trigger click on a javascript link

javascript - 使用 jQuery.extend 合并现有元素

javascript - 使用 .attr 更改 onMouseOver

javascript - 如何使用 ComboBox 作为 Kendo UI 网格列?

javascript - 有关闭包和内部IIFE的一些问题

javascript - 如何处理 react-router 子路由中抛出的异常

javascript - PHP 在单选按钮上将单选值发布到下一页

javascript - 延迟激活 JavaScript 控件

javascript - 单击导航 slider 时,有没有办法禁用自动滚动的光滑 slider ?