【问题标题】:How to verify all matching Brackets如何验证所有匹配的括号
【发布时间】:2022-01-24 00:40:26
【问题描述】:

实现函数 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

【问题讨论】:

  • 测试代码错误。 for (const i in test_inputs) 应该是 for (const i of test_inputs)
  • 没有人会为你解决面试问题。你试过什么?什么不工作?你认为什么不起作用,或者你不明白什么?如果您有具体问题,我们可以提供帮助。
  • 你的函数没有return 1 声明,我看不出它怎么会产生你说的结果。
  • 你的逻辑非常错误。如果 stack 为空,则应在尝试取消移位时返回 0。循环结束后,如果数组为空则返回1,否则返回0
  • @KevinHooke 他的尝试被展示出来了,它只是没有像 OP 声称的那样。

标签: javascript arrays parentheses


【解决方案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;
}

【讨论】:

  • OP 已经在使用堆栈。为什么你只提供自己的解决方案而不是解释 OP 的问题?
  • 感谢您的帮助。我想我的错误是使用 unshift 而不是 push 和 pop 并且不检查堆栈是否为空?
【解决方案2】:

您的代码唯一有问题的是,您在 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)
}

【讨论】:

  • 谢谢!感谢您的帮助!
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多