有效括号C++答案:适用于programiz,不适用于Leetcode

问题描述 投票:0回答:1

我真的很想弄清楚这一点。

输入 s = "([)",programiz 返回 0(假),但 leetcode 返回 1(真)。
如果我添加一个“else”语句来短路错误返回,它会起作用,但它应该首先返回错误。
因为当 myStack.empty() 被调用时,我的堆栈实际上应该变成“([”并返回 false。
完整的可执行代码如下。

// Online C++ compiler to run C++ program online
#include <iostream>
#include <unordered_map>
#include <stack>
using std::string;

class Solution { 
    public:
        bool isValid(string s) {
            std::stack<char> myStack;
            for (int i = 0; i<s.size(); i++){
                if ((s[i] == '(') || (s[i] == '{') || (s[i] == '[')){
                    myStack.push(s[i]);
                }
                else {
                    if (myStack.empty()){
                        return false;
                    }
                    if ((s[i]==')') && (myStack.top()=='(')){
                        myStack.pop();
                    }
                    else if ((s[i]==']') && (myStack.top()=='[')){
                        myStack.pop();
                    }
                    else if ((s[i]=='}') && (myStack.top()=='{')){
                        myStack.pop();
                    }
                    // else { return false; }
                    // If I don't include this else statement the code fails.
                }
            }
            return myStack.empty();
        };
};
int main() {
    // Write C++ code here
    Solution mySolution;
    std::cout << mySolution.isValid("([)");//Correctly returns 0; but return true in leetcode.
    return 0;
}

在programiz上尝试过,正确返回false。 在leetcode上试过,返回true。

c++ stack
1个回答
0
投票
  1. 代码使用堆栈来跟踪遇到的左括号。
  2. 当遇到右括号时,它检查堆栈顶部是否与相应的左括号匹配。如果是,则从堆栈中弹出左括号。
  3. 但是,如果堆栈顶部与右括号不匹配,则没有显式 return 语句来指示括号无效。代码只是继续循环的下一次迭代。
  4. 循环结束后,代码检查堆栈是否为空,如果为空则返回 true,表示括号有效。但如果堆栈不为空(即存在不匹配的左括号),则返回 false。

当遇到右括号且栈顶不匹配,但栈不为空时,就会出现问题。在这种情况下,代码应立即返回 false,但它会继续执行循环的下一次迭代。当循环结束时,堆栈不为空,但代码仍然返回 true,表示括号有效。

要解决此问题,您需要在遇到右括号并且堆栈顶部不匹配时添加显式返回语句。这是更正后的代码:

if ((s[i]==')') && (myStack.top()=='(')){
    myStack.pop();
}
else if ((s[i]==']') && (myStack.top()=='[')){
    myStack.pop();
}
else if ((s[i]=='}') && (myStack.top()=='{')){
    myStack.pop();
}
else {
    return false;  // Add this line to return false when parentheses don't match
}

通过此更正,当遇到右括号并且堆栈顶部不匹配时,代码将正确返回 false。

至于Programiz和LeetCode之间的行为差异,很可能是由于它们的编译器或运行时环境的差异。但是,更正后的代码应该在两个平台上都能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.