我正在尝试计算不匹配的括号总数。
input: text = “(()”
output: 1
input: text = “(())”
output: 0
input: text = “())(”
output: 2
我尝试了以下方法,但是它不起作用:
let isMatchingBrackets = function(str) {
let stack = [];
let count = 0;
for (let i in str.length) {
if (str[i] === "(") {
stack.push(str[i])
} else if (str[i] === ")") {
let tem = map.stack(x => x)
if (tem !== ")") {
count += 1;
} else {
stack.pop();
}
}
}
return stack.length + count
}
console.log(isMatchingBrackets("(()"))
console.log(isMatchingBrackets("(())"))
console.log(isMatchingBrackets("())("))
答案 0 :(得分:3)
首先,您的迭代是错误的。您需要使用for (let i = 0; i < str.length; i++)
来迭代一系列索引。
接下来,if (tem !=== ")")
毫无意义,因为数组永远不能等于字符串。您要检查的是堆栈是否为空。如果您的)
的堆栈为空,则表示它不匹配。
不需要tem
变量。
let isMatchingBrackets = function(str) {
let stack = [];
let count = 0;
for (let i = 0; i < str.length; i++) {
if (str[i] === "(") {
stack.push(str[i])
} else if (str[i] === ")") {
if (stack.length === 0) {
count += 1;
} else {
stack.pop();
}
}
}
return stack.length + count
}
console.log(isMatchingBrackets("(()"))
console.log(isMatchingBrackets("(())"))
console.log(isMatchingBrackets("())("))
但是您实际上根本不需要堆栈。您只需要计算开括号的数量,并在得到匹配的闭括号时减少该计数器。
let isMatchingBrackets = function(str) {
let open_count = 0;
let close_count = 0;
for (let i = 0; i < str.length; i++) {
if (str[i] === "(") {
open_count++;
} else if (str[i] === ")") {
if (open_count === 0) {
close_count ++;
} else {
open_count--;
}
}
}
return open_count + close_count;
}
console.log(isMatchingBrackets("(()"))
console.log(isMatchingBrackets("(())"))
console.log(isMatchingBrackets("())("))
答案 1 :(得分:2)
如果您只需要计算不匹配数,则只需跟踪一下嵌套级别即可,+1
代表左括号,-1
代表右括号:
( ( )
1 2 1
( ( ) )
1 2 1 0
( ) ) (
1 0-1 0
负值是异常,最终的非零值也是
。答案 2 :(得分:0)
我没有检查语法,但是算法应该正确
我建议这个
for (let i in str.length) {
if (str[i] === "(") {
stack.push(str[i])
} else if (str[i] === ")") {
if (stack.length > 0) {
stack.pop();
} else {
count++;
}
}
}
return stack.length + count;
但是,如果您不想更改它,
let tem = map.stack(x => x)
if (tem !== ")") {
count += 1;
} else {
stack.pop();
}
错误是if陈述应为tem!=='(',并且如果找到也应弹出
答案 3 :(得分:0)
再一次尝试。虽然没有经过很好的测试。
let text = [
"(()", //output: 1
"(())", //output: 0
"())(", //output: 2
]
result = ""
text.forEach(t => {
let originalText = t
for(let i = 0; i < t.length; i){
if (t[i] === '('){
if (t.indexOf(')') > -1){
t = t.replace(t[i], '')
t = t.replace(')', '')
}
else {
result += t[i]
t = t.replace(t[i], '')
}
}
if (t[i] === ')'){
result += t[i]
t = t.replace(t[i], '')
}
}
console.log(originalText, result.length)
result = ""
})