搜索
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)
可以在记忆化上做很多手脚,上面的map是存储的索引的结果,可以是false也可以是true,本方法的set指的是那些返回false的结果
方法3:记忆化DFS(使用array)
类似方法1,采用Boolean[]的方式
方法4:记忆化BFS
方法5:DP
分析
这一题是139题的进阶题,需要列出所有的组成方案
方法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
Trie的写法也很有意思
总结
只有方法1是符合题意的O(1)空间复杂度

另外一种写法
方法1:BFS
方法2:回溯
方法1:双向BFS
方法1:回溯
另,逆序排序写法
另
方法2:动态规划+状态压缩
思路来自官解

方法1:DFS枚举所有子集统计
方法1:回溯
岛屿系列问题
岛屿问题之岛屿的数量Eighty-eight Butterfly
岛屿问题之岛屿的周长面积Morpho Cypris Aphrodite
岛屿问题之岛屿的周长面积Morpho Cypris Aphrodite
方法1:DFS

从四个边缘开始反向往内部搜索
上下分别与
Pacific和Atlantic接壤左右分别与
Pacific和Atlantic接壤
方法2:BFS
另
注意题意中这两点的描述
字符串 s 字典顺序小于 字符串 t 有两种情况:
在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。
实际举例:
以下两种情况不存在合法字母顺序:
字母之间的顺序关系存在由至少 22 个字母组成的环,例如words=[“a",“b",“a"];
相邻两个单词满足后面的单词是前面的单词的前缀,且后面的单词的长度小于前面的单词的长度,例如 words=[“ab",“a"]。
方法1:拓扑排序+BFS
方法2:拓扑排序+DFS
官方dfs拓扑排序的思路:
由于拓扑排序的顺序和搜索完成的顺序相反,因此需要使用一个栈存储所有已经搜索完成的节点。深度优先搜索的过程中需要维护每个节点的状态,每个节点的状态可能有三种情况:「未访问」、「访问中」和「已访问」。初始时,所有节点的状态都是「未访问」。
每一轮搜索时,任意选取一个「未访问」的节点 u,从节点 u 开始深度优先搜索。将节点 u的状态更新为「访问中」,对于每个与节点 u 相邻的节点 v,判断节点 v 的状态,执行如下操作:
如果节点 v的状态是「未访问」,则继续搜索节点 v;
如果节点 v 的状态是「访问中」,则找到有向图中的环,因此不存在拓扑排序;
如果节点 v 的状态是「已访问」,则节点 v 已经搜索完成并入栈,节点 u 尚未入栈,因此节点 u 的拓扑顺序一定在节点 v 的前面,不需要执行任何操作。
方法1:递归
搜索与图论问题合辑
Last updated