1 public boolean isMatch(String text, String pattern) { 2 // 多一维的空间,因为求 dp[len - 1][j] 的时候需要知道 dp[len][j] 的情况, 3 // 多一维的话,就可以把 对 dp[len - 1][j] 也写进循环了 4 boolean[][] dp = new boolean[text.length() + 1][pattern.length() + 1]; 5 // dp[len][len] 代表两个空串是否匹配了,"" 和 "" ,当然是 true 了。 6 dp[text.length()][pattern.length()] = true; 7 8 // 从 len 开始减少 9 for (int i = text.length(); i >= 0; i--) {10 for (int j = pattern.length(); j >= 0; j--) {11 // dp[text.length()][pattern.length()] 已经进行了初始化12 if (i == text.length() && j == pattern.length())13 continue;14 //相比之前增加了判断是否等于 * 15 boolean first_match = (i < text.length() && j < pattern.length() && (pattern.charAt(j) == text.charAt(i) || pattern.charAt(j) == '?' || pattern.charAt(j) == '*'));16 if (j < pattern.length() && pattern.charAt(j) == '*') {17 //将 * 跳过 和将字符匹配一个并且 pattern 不变两种情况18 dp[i][j] = dp[i][j + 1] || first_match && dp[i + 1][j];19 } else {20 dp[i][j] = first_match && dp[i + 1][j + 1];21 }22 }23 }24 return dp[0][0];25 }
参考: