class Solution {
public:
    /*
        把能确定的都确定下来,(能确定的一般都是只能满足一种迭代方程的,或者不再迭代方程定义域内的)
    */
    bool match(string str, string pat) {
        int n = str.size(), m = pat.size();
        vector<vector<bool>> dp(n+1,vector<bool>(m+1,false));
        dp[0][0] = true;
        
        for(int j = 2; j <= m; j++){
            // 当 str 为空串时,只能是0次
            if(pat[j-1] == '*') dp[0][j] = dp[0][j-2];
        }
        
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(pat[j-1] == '.' || pat[j-1] == str[i-1]){
                    dp[i][j] =  dp[i-1][j-1];
                }else if(j >= 2 && pat[j-1] == '*'){
                    if(pat[j-2] == '.' || str[i-1] == pat[j-2]){
                        // 能进行匹配可有 0 次 1 次 或 多次!
                        dp[i][j] = dp[i][j-2] || dp[i-1][j-2] || dp[i-1][j];
                    }else {
                        // 不匹配,只能是 0 次!
                        dp[i][j] = dp[i][j-2];
                    }
                }
            }
        }
        return dp[n][m];
    }
};