1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
   | class Solution { public:     bool isMatch(string s, string p) {                  return helper(s, 0, p, 0);     }
      bool helper(string& s, int i, string& p, int j) {         int n = s.size();         int m = p.size();                  if(j == m) return i==n;                  if(i == n) {                          if((m-j)%2 == 1) return false;                          for(; j+1 < m; j+=2) {                 if(p[j+1] != '*') {                     return false;                 }             }
              return true;         }
                   string key = to_string(i) + "," + to_string(j);         if(mp.count(key)) return mp[key];
          bool res = false;                  if(s[i]==p[j] || p[j]=='.') {                          if(j+1<m && p[j+1]=='*') {                 res =  helper(s, i+1, p, j) ||                      helper(s, i, p, j+2);             } else {                                  res = helper(s, i+1, p, j+1);             }         } else {                          if(j+1<m && p[j+1]=='*') {                                  res =  helper(s, i, p, j+2);             } else {                                  res = false;             }         }                  return mp[key] = res;     } private:     unordered_map<string, bool> mp; };
  |