搜索

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

岛屿问题之最大人工岛Danaus Genutia

岛屿问题之岛屿的周长面积Morpho Cypris Aphrodite

岛屿问题之岛屿的周长面积Morpho Cypris Aphrodite

岛屿问题之不同岛屿的数量Monarch Butterfly

岛屿问题之被围绕的区域[Cicada]

搜索与图论之FloodFill-统计子岛屿

方法1:DFS

  • 从四个边缘开始反向往内部搜索

  • 上下分别与PacificAtlantic接壤

  • 左右分别与PacificAtlantic接壤

方法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:递归

搜索与图论问题合辑

1.搜索与图论之FloodFill

2.搜索与图论之最短路

3.搜索与图论之欧拉回路与欧拉路径

4.搜索与图论之拓扑排序

Last updated