0212. 单词搜索 II
题目地址(212. 单词搜索 II)
https://leetcode-cn.com/problems/word-search-ii/
题目描述
前置知识
剪枝
公司
百度
字节
思路
我们需要对矩阵中每一项都进行深度优先遍历(DFS)。 递归的终点是
超出边界
递归路径上组成的单词不在 words 的前缀。
比如题目示例:words = ["oath","pea","eat","rain"],那么对于 oa,oat 满足条件,因为他们都是 oath 的前缀。因此对于 a,oat 来说,它们有希望能找到 oath,但是 oaa 就不满足条件。这是一个关键点,我们的算法就是基于这个前提进行剪枝的,如果不剪枝则无法通过所有的测试用例。
这是一个典型的二维表格 DFS,和小岛专题套路一样:
四个方向 DFS。
为了防止环的出现,我们需要记录访问过的节点。
必须的时候考虑原地修改,减少 visited 的空间开销。
而返回结果是需要去重的。出于简单考虑,我们使用集合(set),最后返回的时候重新转化为 list。
刚才我提到了一个关键词“前缀”,我们考虑使用前缀树来优化。使得复杂度降低为$O(h)$, 其中 h 是前缀树深度,也就是最长的字符串长度。
关于前缀树,可以参考我的前缀树 专题。
值得注意的是如果每次 dfs 都使用 startsWith 来判断,那么会超时。我们可以将当前遍历到的 trie 节点 以参数传递到 dfs 中,这样可以进一步减少复杂度。
关键点
前缀树(也叫字典树),英文名 Trie(读作 tree 或者 try)
DFS
剪枝的技巧
代码
语言支持:Python3
Python3 Code:
关于 Trie 的代码:
主逻辑代码:
相关题目
最后更新于