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