class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.length(); i ++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') stk.push(s[i]);
else {
//三种括弧中左括弧和右括弧ASCII差值最大是2
if (stk.size() && abs(stk.top() - s[i]) <= 2) stk.pop();
else return false;
}
}
return stk.empty();
}
};
常规写法
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.length(); i ++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') stk.push(s[i]);
else {
if (stk.empty()) return false;
else if (s[i] == ')' && stk.top() == '(') stk.pop();
else if (s[i] == ']' && stk.top() == '[') stk.pop();
else if (s[i] == '}' && stk.top() == '{') stk.pop();
else return false; // (])这种情况就要返回false了
}
}
return stk.empty();
}
};
反向判断是否成立(先判断不成立的情况) 参考题解
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
stk.push(s[i]);
else if (s[i] == ')') {
if (stk.empty() || stk.top() != '(')
return false;
stk.pop();
}
else if (s[i] == ']') {
if (stk.empty() || stk.top() != '[')
return false;
stk.pop();
}
else {
if (stk.empty() || stk.top() != '{')
return false;
stk.pop();
}
}
return stk.empty();
}
};
作者:wzc1995
链接:https://www.acwing.com/solution/content/68/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。