【问题标题】:Valid Parenthesis Troubleshooting有效括号故障排除
【发布时间】:2021-03-13 18:33:21
【问题描述】:

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

 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 = ("([)")

【问题讨论】:

    标签: javascript algorithm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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("---(++++)---"))

      【讨论】:

        【解决方案3】:

        您将每个不是左括号的字符都压入堆栈。您只想将左括号压入堆栈。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-15
          • 2010-11-30
          • 2021-09-11
          • 2012-02-18
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多