题目描述
原题链接:20. 有效的括号
解题思路
使用一个栈存储括号,遇到左括号压入,遇到右括号时,查看栈顶元素是否与之匹配,如果匹配则弹出,如果不匹配,则返回true
。
最后看栈中元素是否为空,如果为空说明全部匹配,返回true
。
一、列举情况判断
要注意,如果遇到右括号时,想要top前要保证栈不为空
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 != 0) return false;
stack<char> st;
int n = s.size();
for(int i = 0; i < n; i++) {
if(s[i] == '(' || s[i] == '[' || s[i] == '{') st.push(s[i]);
else if(!st.empty()) {
if(s[i] == ')' && st.top() == '(') st.pop();
else if(s[i] == ']' && st.top() == '[') st.pop();
else if(s[i] == '}' && st.top() == '{') st.pop();
// 当没有可匹配括号时,不可以匹配。例如([}}
else return false;
}
// 当为空里面为空,且加入的不为左括号时,说明进来的是无匹配的右括号。例如:))
else return false;
}
// 当栈中全部匹配完后,栈为空,否则不匹配。例如:[[[
return st.empty();
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
n
)
O(n)
O(n)
二、遇到左括号记录右括号,精简代码
将左括号,用对应的右括号记录,当要弹出右括号时,判定是否与栈中括号相同,若相同,则弹出,若不同则不弹出。
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 != 0) return false;
stack<char> st;
for(int i = 0; i < s.size(); i++) {
if(s[i] == '(') st.push(')');
else if(s[i] == '[') st.push(']');
else if(s[i] == '{') st.push('}');
// 在未遍历完时,st为空或者栈顶元素和s[i]不相同,说明不能匹配
else if(st.empty() || s[i] != st.top()) return false;
// 匹配成功一次,弹出栈顶元素
else st.pop();
}
// 当栈中元素为空说明全部匹配
return st.empty();
}
};
参考文章:20. 有效的括号