如何验证所有匹配的括号
How to verify all matching Brackets
实现函数 verify(text) 验证文本中的括号是否正确嵌套。你需要考虑三种:(), [], <> 并且只有这几种。示例:
verify("---(++++)----") -> 1
verify("") -> 1
verify("before ( middle []) after ") -> 1
verify(") (") -> 0
verify("<( >)") -> 0
verify("( [ <> () ] <> )") -> 1
verify(" ( [)") -> 0
我试着按照下面的方式去做,但面试官说有错误,并给我第二次机会。
function verify(text) {
const stack = [];
for (const c of text) {
if (c === '(') stack.unshift(')')
else if (c === '[') stack.unshift(']')
else if (c === '<') stack.unshift('>')
else if (c === stack[0]) stack.shift()
else if (c === ')' || c === ']' || c === '>') return 0
}
return 1
}
const test_inputs = ["---(++++)----", "", "before ( middle []) after ", ") (", "<( >)", "( [ <> () ] <> )", " ( [)"]
for (const i in test_inputs) {
console.log(verify(i))
}
输出为:
1
1
1
1
1
1
1
我们可以使用Array的pop和push功能。当我们遇到 '('、'['、'<' 字符时,我们将压入堆栈。
另一方面,当我们遇到')'、']'、'>'时,我们弹出堆栈的最后一个元素。如果找不到这些字符的等价物,我们就确定该字符串无效。
最后,如果堆栈中没有剩余元素,则表示该字符串有效。
function verify(text) {
let stack = [];
for (const c of text) {
if (c === '(' || c == '[' || c == '<') {
stack.push(c);
} else if (c === ')' || c == ']' || c == '>') {
if (stack.length == 0) {
return 0;
}
const popValue = stack.pop();
if (c === ')' && popValue != '(') {
return 0;
} else if (c === ']' && popValue != '[') {
return 0;
} else if (c === '>' && popValue != '<') {
return 0;
}
}
}
if (stack.length > 0) {
return 0;
}
return 1;
}
您的代码唯一的错误是,您在 for 循环中使用了 in
而不是 of
。
或者忘记做 verify(test_inputs[i])
而不是 verify(i)
.
解决这个问题,它会产生正确的结果:
function verify(text) {
const stack = [];
for (const c of text) {
if (c === '(') stack.unshift(')')
else if (c === '[') stack.unshift(']')
else if (c === '<') stack.unshift('>')
else if (c === stack[0]) stack.shift()
else if (c === ')' || c === ']' || c === '>') return 0
}
return 1
}
const test_inputs = [
"---(++++)----",
"",
"before ( middle []) after ",
") (",
"<( >)",
"( [ <> () ] <> )",
" ( [)"
]
for (const s of test_inputs) {
console.log(verify(s), s)
}
实现函数 verify(text) 验证文本中的括号是否正确嵌套。你需要考虑三种:(), [], <> 并且只有这几种。示例:
verify("---(++++)----") -> 1
verify("") -> 1
verify("before ( middle []) after ") -> 1
verify(") (") -> 0
verify("<( >)") -> 0
verify("( [ <> () ] <> )") -> 1
verify(" ( [)") -> 0
我试着按照下面的方式去做,但面试官说有错误,并给我第二次机会。
function verify(text) {
const stack = [];
for (const c of text) {
if (c === '(') stack.unshift(')')
else if (c === '[') stack.unshift(']')
else if (c === '<') stack.unshift('>')
else if (c === stack[0]) stack.shift()
else if (c === ')' || c === ']' || c === '>') return 0
}
return 1
}
const test_inputs = ["---(++++)----", "", "before ( middle []) after ", ") (", "<( >)", "( [ <> () ] <> )", " ( [)"]
for (const i in test_inputs) {
console.log(verify(i))
}
输出为:
1
1
1
1
1
1
1
我们可以使用Array的pop和push功能。当我们遇到 '('、'['、'<' 字符时,我们将压入堆栈。 另一方面,当我们遇到')'、']'、'>'时,我们弹出堆栈的最后一个元素。如果找不到这些字符的等价物,我们就确定该字符串无效。 最后,如果堆栈中没有剩余元素,则表示该字符串有效。
function verify(text) {
let stack = [];
for (const c of text) {
if (c === '(' || c == '[' || c == '<') {
stack.push(c);
} else if (c === ')' || c == ']' || c == '>') {
if (stack.length == 0) {
return 0;
}
const popValue = stack.pop();
if (c === ')' && popValue != '(') {
return 0;
} else if (c === ']' && popValue != '[') {
return 0;
} else if (c === '>' && popValue != '<') {
return 0;
}
}
}
if (stack.length > 0) {
return 0;
}
return 1;
}
您的代码唯一的错误是,您在 for 循环中使用了 in
而不是 of
。
或者忘记做 verify(test_inputs[i])
而不是 verify(i)
.
解决这个问题,它会产生正确的结果:
function verify(text) {
const stack = [];
for (const c of text) {
if (c === '(') stack.unshift(')')
else if (c === '[') stack.unshift(']')
else if (c === '<') stack.unshift('>')
else if (c === stack[0]) stack.shift()
else if (c === ')' || c === ']' || c === '>') return 0
}
return 1
}
const test_inputs = [
"---(++++)----",
"",
"before ( middle []) after ",
") (",
"<( >)",
"( [ <> () ] <> )",
" ( [)"
]
for (const s of test_inputs) {
console.log(verify(s), s)
}