我真的很想弄清楚这一点。
输入 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。
当遇到右括号且栈顶不匹配,但栈不为空时,就会出现问题。在这种情况下,代码应立即返回 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之间的行为差异,很可能是由于它们的编译器或运行时环境的差异。但是,更正后的代码应该在两个平台上都能正常工作。