我有一个代码 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/