LeetCode 79. 单词搜索 回溯题解,巩固回溯写法。
题目
79. 单词搜索
https://leetcode.cn/problems/word-search/
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路
回想一下我们人力解的过程:挨个看每个节点,从匹配到的第一个节点开始发散,挨个检查第二个匹配的节点,重复这个过程。
这符合DFS
特征。
DFS
深度优先
思路
外部起个循环,表示挨个找第一个匹配的点,每次执行dfs
,找到一个完整匹配串即可返回。
复杂度分析
时间
最差情况下,我们遍历到最后才匹配到完整的串,那么我们循环了m*n
次,每次dfs
发散四个方向,由于回溯方向一定被使用过了,那么发散方向可以收敛到三个,实际上小于三,内部dfs
深度则为word.len
。
也就是每个dfs
内向三个方向执行word.len
次进行串的匹配。
时间复杂度粗略估计:O(m*n*3^word.len)
。
空间
我们的状态数组used
为额外空间,空间复杂度O(m*n)
。
栈深度O(word.len)
。
代码
|
|
写法学习
类似方向发散的代码还可以使用一个集合来配置方向的元数据:
|
|
剑指 Offer 12. 矩阵中的路径
https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/ 两道题一模一样。
回溯
复杂度分析
同 LeetCode 79 。
代码
|
|
Ref
- 回溯总结在 LeetCode 46. 全排列 DFS题解