0079. 单词搜索
题目地址(79. 单词搜索)
https://leetcode-cn.com/problems/word-search/
题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
前置知识
回溯
公司
阿里
腾讯
百度
字节
思路
在 2D 表中搜索是否有满足给定单词的字符组合,要求所有字符都是相邻的(方向不限). 题中也没有要求字符的起始和结束位置。
在起始位置不确定的情况下,扫描二维数组,找到字符跟给定单词的第一个字符相同的,四个方向(上,下,左,右)分别 DFS 搜索, 如果任意方向满足条件,则返回结果。不满足,回溯,重新搜索。
举例说明:如图二维数组,单词:"SEE"

起始位置(1,0),判断相邻的字符是否匹配单词下一个字符 E.

由于从起始位置 DFS 都不满足条件,所以

起始位置(1,3),判断相邻的字符是否匹配单词下一个字符 E.

位置(0,3)满足条件,继续 DFS,判断相邻的字符是否匹配单词下一个字符 E

从位置(0,3)DFS 不满足条件,继续位置(2,3)DFS 搜索

单词匹配完成,满足条件,返回 True. 
复杂度分析
时间复杂度:
O(m*n) - m 是二维数组行数, n 是二维数组列数空间复杂度:
O(1) - 这里在原数组中标记当前访问过,没有用到额外空间
注意:如果用 Set 或者是 boolean[][]来标记字符位置是否已经访问过,需要额外的空间
O(m*n).
关键点分析
遍历二维数组的每一个点,找到起始点相同的字符,做 DFS
DFS 过程中,要记录已经访问过的节点,防止重复遍历,这里(Java Code 中)用
*表示当前已经访问过,也可以用 Set 或者是 boolean[][]数组记录访问过的节点位置。是否匹配当前单词中的字符,不符合回溯,这里记得把当前
*重新设为当前字符。如果用 Set 或者是 boolean[][]数组,记得把当前位置重设为没有访问过。
代码 (Java/Javascript/Python3)
Java/Javascript/Python3)Java Code
Python3 Code
Javascript Code from @lucifer
参考(References)
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。 大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。 
最后更新于
这有帮助吗?