这道题属于是括号匹配问题,用右括号去匹配左括号,当匹配成功时弹出左括号
此时我们可以想到可以用一种数据结构来表达这种匹配模式:栈
用栈读取左括号,当左括号与右括号匹配成功时就,弹出栈顶
而神奇的很,我们还可以用askll码来看两个符号是否匹配
look this
小括号,中括号,大括号之间的askll码 隔了一条巨大的鸿沟,而小括号之间askll码只隔了1,中括号,大括号之间隔了2,所以我们可以以askll码相减小于2,作为匹配成功的条件。
注意:左括号小于右括号,这里要用取绝对值的函数。
步骤:
1.遍历整个字符串,把左括号全部入栈
2.若不是左括号,则进行判断,若栈为空,或askll码相减大于2,则return false,若匹配成功则淡出栈顶。
3.如果全部匹配完成的话栈是为空的。
class Solution {
public:
bool isValid(string s) {
stack<char>stk;
for(auto c:s){
if(c=='('||c=='['||c=='{'){
stk.push(c);
}
else {
if(stk.size()&&abs(stk.top()-c)<=2)stk.pop();
else return false;}
}
return stk.empty();
}
};