搜索
int[][] cache;
public boolean isMatch(String s, String p) {
cache = new int[s.length() + 1][p.length() + 1];
char[] ss = s.toCharArray(), pp = p.toCharArray();
return isMatch(ss, 0, pp, 0);
}
private boolean isMatch(char[] ss, int s1, char[] pp, int p1) {
if (p1 >= pp.length) return s1 >= ss.length;
if (cache[s1][p1] != 0) return cache[s1][p1] > 0;
boolean f = s1 < ss.length && (ss[s1] == pp[p1] || pp[p1] == '.');
boolean res = true;
if (pp.length - p1 >= 2 && pp[p1 + 1] == '*') {
res = isMatch(ss, s1, pp, p1 + 2) || (f && isMatch(ss, s1 + 1, pp, p1));
if (res) cache[s1][p1] = 1;
else cache[s1][p1] = -1;
return res;
}
res = f && isMatch(ss, s1 + 1, pp, p1 + 1);
if (res) cache[s1][p1] = 1;
else cache[s1][p1] = -1;
return res;
}方法1:回溯
方法2:回溯(累加)
方法1:回溯(递减)
方法2:回溯(累加)
方法1:dfs
方法1:DFS

方法1:回溯
方法1:回溯

方法1:记忆化DFS(使用map)
方法2:记忆化DFS(使用set)
方法3:记忆化DFS(使用array)
方法4:记忆化BFS
方法5:DP
分析
方法1:回溯(StringBuilder)
方法2:记忆化DFS
方法3:记忆化DFS(剪枝)
方法4:DP
方法1:DFS
方法2:DP预处理+DFS
方法3:记忆化DFS
方法1
方法2
方法1:O(1)空间迭代
方法2:DFS
方法3:Trie+DFS
总结

方法1:BFS
方法2:回溯
方法1:双向BFS
方法1:回溯
方法2:动态规划+状态压缩

方法1:DFS枚举所有子集统计
方法1:回溯
岛屿系列问题
方法1:DFS

方法2:BFS
方法1:拓扑排序+BFS
方法2:拓扑排序+DFS
方法1:递归
搜索与图论问题合辑
Last updated