Leetcode 解决方案适用于我的计算机但不适用于网站(有效括号)

Leetcode solution works on my computer but not on website (Valid Parenthesis)

我是 leetcode 的新手,我对这个问题的解决方案得到了错误的结果,但我没有发现任何明显的问题。当我 运行 我的计算机上的代码在这个问题上失败时它可以工作但是在网站上它给出了错误的结果。

const leftBrackets = ["(", "{", "["];
const matchBrackets = { ")": "(", "}": "{", "]": "[" };
const testStack = [];

var isValid = function (s) {
  for (const char of s) {
    if (leftBrackets.includes(char)) {
      testStack.push(char);
    } else if (testStack[testStack.length - 1] === matchBrackets[char]) {
      testStack.pop();
    }
  }

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

这是问题:https://leetcode.com/problems/valid-parentheses/submissions/

这是我对问题的回答。当我 运行 它时,该网站说代码将“{[]}”作为输入得到了错误的结果。它说它 returns 错误,但是当我在我的计算机上的 NodeJS 中 运行 它时它 returns 正确。有谁知道为什么会这样?我只是想在我找到问题的解决方案时能够验证。如果您仍然回答,我也希望对我的解决方案提供反馈。我正在努力提高我的解决方案的效率,而不仅仅是查找所有内容。这似乎应该可以很容易地使用 O(n).

感谢任何回答的人!

编辑:我在下面添加了我的完整解决方案,以防有人在处理这个问题时看到这个 post。它在速度方面做得非常好(56 毫秒,快于 98%)所以我认为它非常高效。花多长时间似乎也是随机的哈哈。

var isValid = function (s) {
  
  const leftBrackets = ["(", "{", "["];
  const matchBrackets = { ")": "(", "}": "{", "]": "[" };
  const testStack = [];
  
  if (s.length % 2 !== 0) return false;
  
  for (const char of s) {
    if (leftBrackets.includes(char)) {
      testStack.push(char);
    } else if (testStack[testStack.length - 1] === matchBrackets[char]) {
      testStack.pop();
    } else return false;
  }
  
  if (testStack.length === 0) return true;
  else return false;
};

您可能只需要将 testStack 移到函数内部,否则它会在 isValid 的所有调用中持续存在。这是另一个假阴性例子:

const leftBrackets = ["(", "{", "["];
const matchBrackets = { ")": "(", "}": "{", "]": "[" };
const testStack = [];

var isValid = function (s) {
  for (const char of s) {
    if (leftBrackets.includes(char)) {
      testStack.push(char);
    } else if (testStack[testStack.length - 1] === matchBrackets[char]) {
      testStack.pop();
    }
  }

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

console.log(isValid('('));
console.log(isValid('[]'));

那就这样吧

var isValid = function (s) {
  const testStack = [];

这样每次调用都有自己的数组。

你的问题不包括问题描述,但一个潜在的错误是你没有检查是否使用了错误的右括号。例如,如果您想要字符串

(])

要失败,您需要更改您的逻辑 - 推送或弹出,如果两个条件都不满足,也许您想要 return false.