核心思想:动态规划
sign[i][j]:字符串s的0到i-1的子字符串和p的0到j-1的子字符串是否匹配。
class Solution {
public boolean isMatch(String s, String p) {
char[] cs = s.toCharArray();
char[] cp = p.toCharArray();
boolean[][] sign = new boolean[s.length()+1][p.length()+1];
//s,p字符串为空
sign[0][0] = true;
//s为空,p不为空
for(int i = 1;i <= p.length(); i++){
if(cp[i-1] == '*'){
sign[0][i] = sign[0][i-2];
}
}
//s不为空,p为空,sign数组sign[][0]默认是false
for(int i = 1; i <= s.length(); i++){
for(int j = 1; j <= p.length(); j++){
//两字符串当前匹配的最后一个字符是否相等或者p为.
if(cs[i-1] == cp[j-1] || cp[j-1] == '.'){
sign[i][j] = sign[i-1][j-1];
}else if(cp[j-1] == '*'){ //p可能为*,需要向前看一个字符
if(cs[i-1] == cp[j-2] || cp[j-2] == '.'){
//匹配了0次(*前字符相同但是还没配过)或者匹配了n次
sign[i][j] = sign[i][j-2] || sign[i-1][j];
}else{
//匹配了0次(*字符前不相同)
sign[i][j] = sign[i][j-2];
}
}
}
}
return sign[s.length()][p.length()];
}
}