1. 题目来源
链接:20. 有效的括号
2. 题目解析
很经典栈的应用。其中不匹配的情况一共有两种:
- 当栈顶元素不能成功匹配
- 最后栈还有剩余元素
关于栈顶元素和当前括号的判断,switch-case
语句可以,if-else
嵌套判断也可以。实际上,左右括号的 ascll
值是相邻的。小括号,40, 41, 中括号 91, 93,大括号,123,125。可以发现,如果两个括号是一对的话,其两个括号的 ascll
值之差是不会大于 2 的。可以很方便的简化代码。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
不要小看这个简单的括号序列,后面真是要多难有多难,dfs、dp
、卡特兰数 都能套上整一整。
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto &c : s) {
if (c == '{' || c == '[' || c == '(') stk.push(c);
else {
if (stk.size() && abs(stk.top() - c) <= 2) stk.pop();
else return false;
}
}
return stk.empty();
}
};
// if-else 嵌套
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto &c : s) {
if (c == '{' || c == '[' || c == '(') stk.push(c);
else if (c == '}') {
if (stk.empty() || stk.top() != '{') return false;
stk.pop();
} else if (c == ']') {
if (stk.empty() || stk.top() != '[') return false;
stk.pop();
} else {
if (stk.empty() || stk.top() != '(') return false;
stk.pop();
}
}
return stk.empty();
}
};