题目

分析
思路一
建一个哈希表来存<char,char>的键值对,其中前一个为左括号,后一个为右括号。并且还需要一个栈来存放字符中的括号,遍历字符串,当遇到左括号时先加入栈中,因为它们是不完整的;那么遇到右括号,则检测目前栈顶是否其对应的左括号,如果是则将栈顶括号弹出。一直遍历,到最后这个栈空掉了就说明都有其对应的括号。
代码
cpp
class Solution {
public:
bool isValid(string s) {
unordered_map<char,char>kuohao;
kuohao['('] = ')';
kuohao['['] = ']';
kuohao['{'] = '}';
stack<char>tmp;
for(auto c : s){//遍历加入栈中
if(tmp.empty()){
tmp.push(c);
}
else{
char temp = tmp.top();
if(c == kuohao[temp]){//如果匹配则弹出
tmp.pop();
}
else{
tmp.push(c);//否则就加入栈中
}
}
}
if(tmp.empty()){//如果最后栈为空则说明是有效的括号串
return true;
}
else{
return false;
}
}
};
结果

思路二
不去单独建一个表存括号对,而是遇到左括号去把右括号压进栈,如果真的遇到右括号那么检测栈顶是否是这个右括号,也就是说明前一个是其对应的左括号。
代码
cpp
class Solution {
public:
bool isValid(string s) {
if (s.length() % 2) {//奇数长度的字符串不可能全部有效
return false;
}
stack<char> st;
for(char c:s){
if(c =='(') st.push(')');
else if (c=='[') st.push(']');
else if (c=='{') st.push('}');
else{
if(st.empty() || st.top() != c){//对应不上,则为假
return false;
}
st.pop();
}
}
return st.empty();
}
};
结果
