关键点
如果pattern至少有两个字符,且第二个是 ' \* ',那么
· 第一个匹配,字符串string去头再匹配,
· 匹配, 返回匹配
· 不匹配, 把头还回去,返回 pattern去头两个再匹配的结果;
· 第一个不匹配,返回 pattern去头(头两个)再匹配的结果
如果pattern第二个不是 ' \* '
· 第一个匹配,两个字符串去头再匹配
· 第一个不匹配,返回不匹配
注意到递归过程中有大量重复,我们采取记忆化递归
class Solution {
private char[] a ;
private char[] b ;
private int[][] flag ;
private int dp(int ai, int bi) {
if(ai >= a.length) {
return bi >= b.length ? 2 : 1;
}
if(bi >= b.length) {
if(ai + 1 < a.length && a[ai+1] == '*') {
return dp(ai+2, bi);
}else {
return 1;
}
}
if(flag[ai][bi] != 0) {
return flag[ai][bi]; // 2 means match and 1 not.
}
boolean match = a[ai] == b[bi] || a[ai] == '.';
if(ai +1 <a.length && a[ai+1] == '*') {
return flag[ai][bi] =
((match && dp(ai, bi+1) == 2) || dp(ai+2, bi) == 2) ? 2 : 1;
}else if(match) {
return flag[ai][bi] = dp(ai+1, bi+1);
}
return flag[ai][bi] = 1;
}
public boolean isMatch(String s, String p) {
if(p.isEmpty()) return s.isEmpty();
boolean flag = s.length() >= 1 && (p.charAt(0) == '.' || s.charAt(0) == p.charAt(0));
if(p.length() >1 && p.charAt(1) == '*') {
return isMatch(s, p.substring(2)) || (flag && isMatch(s.substring(1), p));
}
return flag ? isMatch(s.substring(1), p.substring(1)) : flag;
}
}