题解需要一定基础:知道如何通过暴力递归改为动态规划
但本题修改为动态规划有一定难度,所以呈现代码如下:
暴力:
private boolean process(char[] strS, char[] strP, int i, int j) {
if (i >= strS.length) {
if (j < strP.length && strP[j] == '*')
j++;
for (; j < strP.length - 1; j += 2) {
if (strP[j + 1] != '*')
return false;
}
return true;
}
boolean flag = false;
//后一个是*
if (j + 1 < strP.length && strP[j + 1] == '*') {
//不匹配
flag |= process(strS, strP, i, j + 2);
//相等则匹配
if (strS[i] == strP[j] || strP[j] == '.')
flag |= process(strS, strP, i + 1, j);
} else if (j < strP.length) {
if (strS[i] == strP[j] || strP[j] == '.')
flag |= process(strS, strP, i + 1, j + 1);
}
return flag;
}
动态规划:
private boolean process(char[] strS, char[] strP) {
boolean[][] dp = new boolean[strS.length + 1][strP.length + 1];
//初始化
for (int i = 0; i < strP.length + 1; i++) {
boolean flag = false;
int j = i;
for (; j < strP.length; j++) {
if (strP[j] == '*')
continue;
else {
if (j + 1 < strP.length) {
if (strP[j + 1] != '*') {
dp[strS.length][i] = false;
flag = true;
break;
}
} else {
dp[strS.length][i] = false;
flag = true;
break;
}
}
}
if (!flag)
dp[strS.length][i] = true;
}
//填表
for (int i = strS.length - 1; i >= 0; i--) {
for (int j = strP.length; j >= 0; j--) {
//后一个是*
if (j + 1 < strP.length && strP[j + 1] == '*') {
//不匹配
if (j + 2 <= strP.length)
dp[i][j] |= dp[i][j + 2];
else {
dp[i][j] |= true;
}
//相等则匹配
if (strS[i] == strP[j] || strP[j] == '.')
dp[i][j] |= dp[i + 1][j];
} else if (j < strP.length) {
if (strS[i] == strP[j] || strP[j] == '.') {
if (j + 1 <= strP.length)
dp[i][j] |= dp[i + 1][j + 1];
else
dp[i][j] |= true;
}
}
}
}
return dp[0][0];
}