1 . 回溯法
class Solution {
public boolean isMatch(String s, String p) {
if(s==null||p==null)
return false;
int sIndex=0,pIndex=0;
return match(s,sIndex,p,pIndex);
}
public boolean match(String s,int sIndex,String p,int pIndex){
if(sIndex==s.length()&&pIndex==p.length())
return true;
if(sIndex!=s.length()&&pIndex==p.length())
return false;
if(pIndex+1<p.length()&&p.charAt(pIndex+1)=='*'){
if(sIndex!=s.length()&&
((s.charAt(sIndex)==p.charAt(pIndex))||(p.charAt(pIndex)=='.')))
return match(s,sIndex,p,pIndex+2)
||match(s,sIndex+1,p,pIndex+2)
||match(s,sIndex+1,p,pIndex);
else
return match(s,sIndex,p,pIndex+2);
}
if((sIndex!=s.length()&&(s.charAt(sIndex)==p.charAt(pIndex)))
||(sIndex!=s.length()&&p.charAt(pIndex)=='.'))
return match(s,sIndex+1,p,pIndex+1);
return false;
}
}
2 . DP dp[i][j]的含义是s[0-i] 与 p[0-j]是否匹配。
其中s.charAt(i-1) p.charAt(j-1)才代表当前循环的字符。
dp[][]的下标对应关系和charAt的下标对应关系要清楚。
class Solution {
public boolean isMatch(String s, String p) {
if(s==null||p==null)
return false;
int m=s.length(),n=p.length();
boolean dp[][]=new boolean[m+1][n+1];
dp[0][0]=true;
for(int j=1;j<=n;j++){
dp[0][j]=j>1&&p.charAt(j-1)=='*'&&dp[0][j-2];
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(p.charAt(j-1)=='*')
dp[i][j]=dp[i][j-2]
||(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.')&&dp[i-1][j];
else
dp[i][j]=(s.charAt(i-1)==p.charAt(j-1)||p.charAt(j-1)=='.')&&dp[i-1][j-1];
}
return dp[m][n];
}
}