还是有点不太理解。
但是可以肯定的是分类讨论的思想,用模式串p取匹配源字符串s。只有p中会有。*之类的。
问题的关键在于p当前匹配的字符是否为*,
设dp[i][j]表示str前i个字符和pattern前j个字符是否匹配。dp【2】【3】表示s的前三个(aad)与p的前2个(c*)是否匹配
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];