class Solution {
public:
   bool match(string str, string pattern) {
        vector<vector<bool>>dp(str.length()+10,vector<bool>(pattern.length()+10,false));
        dp[0][0]=true;
        for(int i=1;i<=pattern.length();i++)if(pattern[i-1]=='*')dp[i][0]=dp[i-2][0];
        for(int i=1;i<=pattern.length();i++)
        for(int j=1;j<=str.length();j++)
        {
            if(pattern[i-1]=='*')
            {
                if(pattern[i-2]=='.')dp[i][j]=true;
                else if(pattern[i-2]==str[j-1])dp[i][j]=dp[i-1][j]||dp[i-1][j-1]||dp[i-2][j];
                else dp[i][j]=dp[i-2][j];
            }
            else if(pattern[i-1]=='.'||str[j-1]==pattern[i-1]) dp[i][j]=dp[i-1][j-1];
        }
        return dp[pattern.length()][str.length()];
    }
};