有效括号故障排除



我正在处理一个涉及有效括号的编码挑战,我正在试图解决为什么它没有给我预期的响应。

function isValid(str) {
if (str.length === 0)
return true
let matchingOpeningBracket, char
let stack = []
let openingBrackets = ['[', '<', '(']
let closingBrackets = [']', '>', ')']
for (let i = 0; i < str.length; i++) {
char = str[i]
if (closingBrackets.indexOf(char) > -1) {
matchingOpeningBracket = openingBrackets[closingBrackets.indexOf(char)]
if (stack.length == 0 || (stack.pop() != matchingOpeningBracket)) {
return false
}
} else {
stack.push(char)
}
}
return (stack.length == 0)
};

当我尝试检查console.log(isValid('——(++++)——'))和console.log(isValid('before(middle[])after'))时,它会给我一个假值,但它应该根据挑战键传递为真。我不确定我错过了哪一步。其他测试示例都按照预期记录日志,除了第一个2。

//true // returns false
// let example1 = ("before(middle[])after")
//true //returns false
// let example1 = ("---(++++)---")
//true 
// let example1 = ("")
//false 
// let example1 = (")(")
//false
// let example1 = ("<(>)")
//true 
// let example1 = ("([<>()])")
//false
// let example1 = ("([)")

当您应该忽略既不是左括号也不是右括号的字符时,您正在将所有不是右括号的字符压入堆栈。将else条件改为:

else if (openingBrackets.indexOf(char) > -1) {

我绝对不想把事情复杂化,所以我给出了一个简单的解决方案,所以如果你觉得合适,你可以使用它:)

function isValid(str) {
if (str.length === 0)
return true
let char;
let stack = [];
let openingBrackets = ['[', '<', '(']
let closingBrackets = [']', '>', ')']
matchesOpen = (val) => (val === '[' || val === '<' || val === '(')
matchesclose = (val) => (val === ']' || val === '>' || val === ')')
getOpeningBracket = (val) => {
switch (val) {
case ']':
return '[';
case ')':
return '(';
case '>':
return '<';
default:
return '';
}
}
for (let i = 0; i < str.length; i++) {
char = str[i]
if (matchesOpen(char)) {
stack.push(char);
} else if (matchesclose(char)) {
if (stack.pop() !== getOpeningBracket(char)) return false;
}
}
return (stack.length == 0)
};
console.log(isValid(('---(++++)---')))
console.log(isValid('before(middle[])after'))
console.log(isValid("---(++++)---"))

你将每个不是左括号的字符都压入堆栈。你只需要将左括号压入堆栈。

注意,只要字符串中有非括号字符,就会得到false结果。

最新更新