这是一个典型的动态规划题,通过字符串p去匹配字符串s,dp[i][j]表示p的前i个字符串能否匹配s的前j个字符串。
首先初始化申请[n+1][m+1]的二维数组,从而简化了前0个字符串能否匹配的问题,简化了边界条件。
判断时分为p为和不为两种情况。p不为时,只要前面的字符串dp[i-1][j-1]能够匹配并且当前字符也能匹配即可。p为时,可以分为0,1和多三种情况。0的话就直接用dp[i-2][j]判断p的i-2的字符串能够匹配s的j就行,1和多的时候就对应了dp[i-1][j-1]和dp[i][j-1]两种,并且还需要判断当前的字符串能否匹配。
public boolean isMatch(String s, String p) {
int n = p.length();
int m = s.length();
boolean[][] dp = new boolean[n+1][m+1];
dp[0][0] = true;
for(int i = 1; i < n && p.charAt(i) == '*'; i += 2){
dp[i+1][0] = true;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(dp[i-1][j-1] && (p.charAt(i-1) == s.charAt(j-1) || '.' == p.charAt(i-1))){