一、题目
二、思路
这里需要使用一个辅助栈,用于保存出现过的左半边括号,遍历括号字符串,若当前字符是左半边括号 ( 或 [ 或 { ,则直接将其压栈等待和后续的右半边括号匹配,若当前的字符是 ‘)’,则查看辅助栈的栈顶字符,若栈为空或栈顶字符不为‘(’,则表示括号不匹配,返回false,若栈顶字符是‘(’,则表示当前括号匹配,将栈顶字符出栈,对 ] 和 } 做同样的处理。
可以想象,若括号字符串完全匹配,则匹配完后辅助栈必然为空,若遍历完括号字符串而辅助栈不为空,则表示左半边括号比右半边的多,不匹配。
三、代码
class Solution {
public:
bool isValid(string s) {
int len = s.size();
if(len % 2 == 1) return false;
stack<char> st; //保存出现过的左半边括号
for(int i=0; i<len; i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
st.push(s[i]); //左半边括号直接进栈
}else if(s[i] == ')'){ //栈为空或不匹配 均是false
if(st.empty() || st.top() != '(') return false;
else st.pop();
}else if(s[i] == ']'){
if(st.empty() || st.top() != '[') return false;
else st.pop();
}else if(s[i] == '}'){
if(st.empty() || st.top() != '{') return false;
else st.pop();
}
}
if(!st.empty()) return false; //若栈中还剩余括号,则为不匹配
return true;
}
};