class Solution {
public:
bool isValid(string s) {
stack<char> stk; // 栈中存放还未匹配的左括号
for (int i = 0; i < s.length(); i++) {
// 1. 遇到左括号,直接入栈
if (s[i] == '{' || s[i] == '(' || s[i] == '[') {
stk.push(s[i]);
}
// 2. 遇到右括号,与栈顶左括号进行匹配
else {
// 栈为空,说明当前右括号没有对应的左括号
if (stk.empty()) return false;
// 判断当前右括号与栈顶左括号是否匹配
if (s[i] == '}' && stk.top() != '{') return false;
if (s[i] == ']' && stk.top() != '[') return false;
if (s[i] == ')' && stk.top() != '(') return false;
// 匹配成功,弹出对应的左括号
stk.pop();
}
}
// 栈为空:所有左括号都成功匹配
// 栈不为空:还有左括号没有对应的右括号
return stk.empty();
}
};
思路总结
这题利用的是**栈的后进先出(LIFO)**特性。
例如:
s = "{[()]}"
遇到 { → 入栈 {
遇到 [ → 入栈 { [
遇到 ( → 入栈 { [ (
遇到 ) → 和 ( 匹配 → 弹出
遇到 ] → 和 [ 匹配 → 弹出
遇到 } → 和 { 匹配 → 弹出
最终:栈为空 → true
核心流程可以记成:
左括号 → 入栈
右括号 →
栈为空 → false
和栈顶不匹配 → false
和栈顶匹配 → pop()
遍历结束 →
栈为空 → true
栈不为空 → false
时间复杂度: O(n),每个字符最多入栈、出栈一次。
空间复杂度: O(n),最坏情况下字符串全部都是左括号。
自己做的问题:
1.栈、队列用 push();vector、string、list 等序列容器通常用 push_back()。
2.匹配成功要pop()
3.最终的返回stk.empty() 如果所有的右括号都匹配过了,但是左括号还有剩余,就是false