javascript - 平衡字符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 false
return true
我查看了我的代码,但无法缩小问题范围。请帮忙...?
解决方案
您的代码中的问题是您希望右括号始终位于最终位置,即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
,这始终与单字符串不同。
推荐阅读
- reactjs - 无法让探查器在 dev 或 prod 上工作
- javascript - 单击文件输入时防止页面重新加载
- azure-active-directory - 在不删除用户或重新添加用户的情况下通过林移动到同步
- java - 尝试从逗号分隔的字符串作为输入循环 arraylist 时出错
- flutter - 在导航到登录页面之前加载 SnackBar
- php - Laravel /w Docker bash 脚本别名
- ios - 使用 ip 地址或其他替代方法在远程系统上设置 Xcode 服务器
- javascript - 打印所选 dom 的样式,即使我用样式标签指定了它,它也会作为带有值“”的字典出现
- button - 如何在动作方法中找到点击的按钮
- html - 如何按内容制作灵活的列?