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 }
参考:https://leetcode.windliang.cc/leetCode-44-Wildcard-Matching.html