类似的两个字符串之间的对比都可以使用二维的动态规划实现。
首先定义二维dp数组并且初始化数组,注意字符串p中的 * 号可以匹配任意字符串,因此有:
dp[i][j] = dp[i - 1][j] || dp[i][j - 1]
当字符串s中的字符为?号或者连个字符串对应位置的字符相等时,有:
dp[i][j] = dp[i - 1][j - 1]
最后返回dp数组的右下角元素即可。
class Solution {
public boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
for (int j = 1; j <= p.length(); j++) {
if (p.charAt(j - 1) == '*') dp[0][j] = dp[0][j-1];
}
for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= p.length(); j++) {
// * 号配多个字符或空字符串
if (p.charAt(j - 1) == '*') {
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
// ? 号或两个字符相等时,存入上一个字符对比的结果
} else if (p.charAt(j - 1) == '?' || s.charAt(i - 1) == p.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
}
}
}
return dp[s.length()][p.length()];
}
}