有效的括号。给出错误的布尔值(LeetCode 上的 JS 问题)

Valid Parentheses. Gives a wrong boolean (JS problems on LeetCode)

试图在 LeetCode 上解决一个名为“有效括号”的问题。

条件是:

Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

Open brackets must be closed by the same type of brackets. Open brackets must be closed in the correct order.

wrote 一个函数,它在这个片段中工作:

let arr = ['()']

var isValid = function (data) {
    let stack = [];
    const bracketsArray = {
      '{':'}',
      '[':']',
      '(':')'
    }
            
    for (i=0; i < data[0].length; i++) {
        if (data[0][i] == '{' || data[0][i] == '(' || data[0][i] == '[') {
            stack.push(data[0][i]);
        } else if (data[0][i] == '}' || data[0][i] == ']' || data[0][i] == ')') {
            if (bracketsArray[stack[stack.length-1]] == data[0][i]) {
              stack.pop()
            }
        }  
    }
    
    if (stack.length == 0) {
      return true
    } else {
      return false
    }
}

console.log(isValid(arr))

函数给出了正确的输出(布尔值) 但是当我出于某种原因 运行 LeetCode 上的这段代码时,相同的代码给了我一个错误的布尔值。

没看懂哪里不对

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let stack = [];
    const bracketsArray = {
      '{':'}',
      '[':']',
      '(':')'
    }
    
    
    for (i=0; i < s[0].length; i++) {
        if (s[0][i] == '{' || s[0][i] == '(' || s[0][i] == '[') {
            stack.push(s[0][i]);
        } else if (s[0][i] == '}' || s[0][i] == ']' || s[0][i] == ')') {
            if (bracketsArray[stack[stack.length-1]] == s[0][i]) {
              stack.pop()
            }
        }  
    }

   if (stack.length == 0) {
     return true;
   } else {
     return false;
   }
};

有什么建议吗?

在 LeetCode 上,函数参数是一个字符串,但在你的测试中,你传递的是一个数组,而且你的函数代码需要一个数组,因为它使用 s[0] 而不是 [=12] 访问字符串=].

无关,但是:

  • 当输入只是一个右括号时,您的代码将失败。这是因为当遇到 non-matching 右括号时,您的循环不会因 return false 而中断。这应该发生在 if (bracketsArray[stack[stack.length-1]] == s[i]) {

    else 部分
  • 不要使用未声明的变量i,它会隐式成为一个全局变量(如果运行处于non-strict模式)。

  • 不要将变量命名为 bracketsArray,因为它不是数组。

  • 更多地使用那个对象,而不是用左括号进行三个比较。

  • 最后的 if...then 对于只返回布尔表达式的值来说有点矫枉过正了。

所以:

var isValid = function(s) {
    const stack = [];
    const brackets = {
      '{':'}',
      '[':']',
      '(':')'
    }
    const closing = Object.values(brackets);
    
    for (let ch of s) {
        if (brackets[ch]) {
            stack.push(brackets[ch]);
        } else if (ch == stack.at(-1)) {
            stack.pop()
        } else if (closing.includes(ch)) {
            return false;
        }
    }

    return !stack.length;
};

console.log(isValid("{([])}")); // true
console.log(isValid("]")); // false

您访问迭代的当前字符的方式是错误的。不要做 s[0][i],只需做 s[i].

s[0][i] 访问第一个字符,然后尝试从中获取 i-th 条目(未定义)。

var isValid = function(s) {
    let stack = [];
    const bracketsArray = {
      '{':'}',
      '[':']',
      '(':')'
    }
    
    
    for (i=0; i < s.length; i++) {
        if (s[i] == '{' || s[i] == '(' || s[i] == '[') {
            stack.push(s[i]);
        } else if (s[i] == '}' || s[i] == ']' || s[i] == ')') {
            if (bracketsArray[stack[stack.length-1]] == s[i]) {
              stack.pop()
            }
        }  
    }

   if (stack.length == 0) {
     return true;
   } else {
     return false;
   }
};

isValid("{([])}") // true
isValid("{([)}") // false