class Solution {
public:
    /*
        把能确定的都确定下来,(能确定的一般都是只能满足一种迭代方程的,或者不再迭代方程定义域内的)
    */
    bool match(string str, string pat) {
        return cat(str,pat,0,0);
    }
    
    bool cat(string str,string pat,int i,int j){
      if(j == pat.size()) return i == str.size();
      bool first_match = i < str.size() && (pat[j] == '.' || pat[j] == str[i]); // 当前字符是否匹配!
      if(j + 1 < pat.size() && pat[j+1] == '*'){// 如果下一步遇到*
          return cat(str,pat,i,j+2) || (first_match && cat(str,pat,i+1,j));// 考虑*代表0个 或多个!
      }else {
          return first_match && cat(str,pat,i+1,j+1);// 没遇到*同时先后移动!
      }
    }
};