还是有点不太理解。
但是可以肯定的是分类讨论的思想,用模式串p取匹配源字符串s。只有p中会有。*之类的。

问题的关键在于p当前匹配的字符是否为*,
dp[i][j]表示stri个字符和patternj个字符是否匹配。dp【2】【3】表示s的前三个(aad)与p的前2个(c*)是否匹配
。初始状态dp【0】【0】=1
1.
 //当前p的字符不为*,用.去匹配或者字符直接相同  eg  s=ab,p=ab  b=b 
                if(pattern[j - 1] != '*'&& (pattern[j - 1] == '.'|| pattern[j - 1] == str[i - 1])){
                      dp[i][j] = dp[i - 1][j - 1];
2.
//当前的字符为*       eg  s=aa p=a* 
                }else if(j >= 2&& pattern[j - 1] == '*'){
                    //若是前一位为.    eg  s=aa p=
//或者前一位可以与这个数字匹配  eg  s=aa p=a * 
//出现这两种情况都是可用匹配的。 就是if(pattern[j - 2] == '.'|| pattern[j - 2] == str[i - 1])
                    
                    if(pattern[j - 2] == '.'|| pattern[j - 2] == str[i - 1])
                        //转移情况  
                        dp[i][j] = dp[i - 1][j] || dp[i][j - 2]; //可以解读为,当p的这一位(j-1)是*时(可以匹配),状态转移方程要么是dp[i - 1][j]要么是dp[i][j - 2]
                                                                                    即p当前字符是*,他的状态要看s的前i-1位于p的前j位的状态,要么就要看s的前i位与p的前j-2位的状态。
                    else
                        //不匹配    若不可以匹配那么*可取的次数必然为0,就是j-1重复0次,等于同时失效两位  *与*前的一位。
                        dp[i][j] = dp[i][j - 2];