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;
}
};