首页 > 解决方案 > 平衡字符Javascript

问题描述

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

这是我的代码:

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 says yes!)", "()")and ,但当它应该在其中时isBalanced("(Sensei [says] yes!)", "()[]"),代码却不起作用。--isBalanced("Sensei says -yes-!", "--")returned falsereturn true

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

标签: javascript

解决方案


您的代码中的问题是您希望右括号始终位于最终位置,即strArr[strArr.length -1].

与其向前看,不如向后看,看看之前遇到的左括号是否与当前遇到的右括号匹配。并维护一个堆栈,以便您可以管理嵌套的括号。

当对具有相同的开始和结束字符时,假设第二次出现总是用于结束。因此,请确保首先检查当前字符是否正在关闭先前打开的括号,并且仅当失败时,检查该字符是否为关闭字符(在 中的奇数位置caps):

function isBalanced(s, caps) {
    let closersStack = [];
    for (let ch of s) {
        let i = caps.indexOf(ch);
        if (i < 0) continue; // not an opener nor closer
        if (closersStack[closersStack.length-1] === ch) { // is closing
            closersStack.pop();
        } else if (i % 2 === 0) { // is opening
            closersStack.push(caps[i+1]); // push the expected closer
        } else return false; // mismatch: an unexpected closer
    }
    return !closersStack.length; // all openers should have been closed
}
// Some test cases
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!)", "()[]"));

closersStack[-1]请注意,此脚本依赖于不触发错误但给出的事实undefined,这始终与单字符串不同。


推荐阅读