@@ -33,8 +33,10 @@ words = ["oath","pea","eat","rain"] and board =
3333
3434## 前置知识
3535
36- - 前缀树
37- - DFS
36+ - [ 前缀树] ( ../thinkings/trie.md )
37+ - [ 深度优先遍历] ( ../thinkings/DFS.md )
38+ - [ 小岛专题] ( ../thinkings/island.md )
39+ - 剪枝
3840
3941## 公司
4042
@@ -48,9 +50,15 @@ words = ["oath","pea","eat","rain"] and board =
48501 . 超出边界
49512 . 递归路径上组成的单词不在 words 的前缀。
5052
51- 比如题目示例:words = [ "oath","pea","eat","rain"] ,那么对于 oa,oat 满足条件,因为他们都是 oath 的前缀,但是 oaa 就不满足条件。
53+ 比如题目示例:words = [ "oath","pea","eat","rain"] ,那么对于 oa,oat 满足条件,因为他们都是 oath 的前缀。因此对于 a,oat 来说,它们** 有希望** 能找到 oath,但是 oaa 就不满足条件。这是一个关键点,我们的算法就是基于这个前提进行剪枝的,如果不剪枝则无法通过所有的测试用例。
54+
55+ 这是一个典型的二维表格 DFS,和[ 小岛专题] ( ../thinkings/island.md ) 套路一样:
56+
57+ - 四个方向 DFS。
58+ - 为了防止环的出现,我们需要记录访问过的节点。
59+ - 必须的时候考虑原地修改,减少 visited 的空间开销。
5260
53- 为了防止环的出现,我们需要记录访问过的节点。 而返回结果是需要去重的。出于简单考虑,我们使用集合(set),最后返回的时候重新转化为 list。
61+ 而返回结果是需要去重的。出于简单考虑,我们使用集合(set),最后返回的时候重新转化为 list。
5462
5563刚才我提到了一个关键词“前缀”,我们考虑使用前缀树来优化。使得复杂度降低为$O(h)$, 其中 h 是前缀树深度,也就是最长的字符串长度。
5664
@@ -60,7 +68,7 @@ words = ["oath","pea","eat","rain"] and board =
6068
6169- 前缀树(也叫字典树),英文名 Trie(读作 tree 或者 try)
6270- DFS
63- - hashmap 结合 dfs 记录访问过的元素的时候,注意结束之后需要将 hashmap 的值重置。(下方代码的 ` del seen[(i, j)] ` )
71+ - 剪枝的技巧
6472
6573## 代码
6674
0 commit comments