解法分析:
越远的左括号匹配越远的右括号,越近的左括号匹配越近的右括号,正符合堆栈先进后出性质 。
因此利用堆栈保存左括号,通过循环逐个括号判断:
class Solution {
public:bool isValid(string s) {stack<char> stk;char pre;//读取上一个入栈的左括号int leftcount=0;//记录左括号个数,和总个数对比if(s.size()%2) return false;//不是偶数个括号if(s[0]==')'||s[0]==']'||s[0]=='}') return false;//开头不能是右括号for(int i = 0;i<s.size();i++){ if(s[i]=='('||s[i]=='['||s[i]=='{')//左括号入栈,遇到右括号出栈配对{stk.push(s[i]);leftcount++;}if(leftcount > (s.size() >> 1)) return false;//左括号个数不能过半if(stk.size() > (s.size() >> 1)) return false;//栈内元素不能过半if(s[i]==')'){ if(stk.empty()) return false;//栈为空说明没有配对的左括号pre = stk.top();//出栈检查前一个左括号是否匹配当前右括号stk.pop();if(pre!='(') return false;}else if(s[i]==']'){if(stk.empty()) return false;pre = stk.top();stk.pop();if(pre!='[') return false;}else if(s[i]=='}'){if(stk.empty()) return false;pre = stk.top();stk.pop();if(pre!='{') return false;}}return true;}
};