class Solution { public: bool isValidString(string s) { stack<int> left; stack<int> star; //使用了两个栈,一个存左括号,一个存右括号; int n = s.size(); for(int i=0; i<n; i++){ char c = s[i]; if(c == '('){ left.push(i); }else if(c == '*'){ star.push(i); }else{ if(!left.empty()){ //优先匹配左括号,因为即使有*在左右括号之间,后续还有右括号,也当做是:前一个右括号匹配的是*,后一个右括号匹配得是左括号;后续若是左括号,*当成空格字符 left.pop(); }else if(!star.empty()){ star.pop(); }else{ return false; } } } //对剩余的左括号进行匹配,*当做右括号,且保证有*在左括号右边;后一个左括号可以当做*匹配,当前左括号与右括号匹配; while(!left.empty()){ if(star.empty() || star.top() < left.top())return false; else{ left.pop(); star.pop(); } } return true; } };