用栈解决,遍历字符串,如果碰到左括号,就入栈,如果碰到右括号,就判断栈顶元素是否是其对应的左括号,如果是,就将对应左括号出栈,否则就返回false。
字符串遍历完成,如果栈为空,则是有效的括号,否则不是。
class Solution {
public:
bool isValid(string s) {
// 括号字符一定成对出现,且左括号先出现
int len = s.length();
if(len % 2 ==1) return false;
unordered_map<char, char> m;
m[')'] = '(';
m['}'] = '{';
m[']'] = '[';
stack<char> st;
for(auto c : s){
if(m.count(c)){ // 遍历到右括号,查看栈顶元素是否是对应的左括号
if(st.empty() || st.top() != m[c]){
return false;
}
st.pop(); // 取出栈顶左括号
}else{
st.push(c);
}
}
return st.empty();
}
};