题目描述
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方法
方法一:深度优先搜索+剪枝
思路:遍历二维数组中的每一个元素作为起始元素,然后深度优先搜索,其中设置三个参数:i,j,k,分别表示二维数组的横坐标,纵坐标和word中的元素位置,如果i,j超出取值范围或者i,j对应二维数组中的元素和k对应的word中的元素如果不相等,则结束继续搜索,如果k对应为word的长度减1,则返回找到。如果遍历完后还未找到,则返回没找到。在深度优先搜索过程中,如果遍历过某个元素,则置为”,后续回溯的时候记得还原回原来的元素。
代码:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def dfs(i, j, k):
if not 0<=i<len(board) or not 0<=j<len(board[0]) or board[i][j] != word[k]:
return False
if k == len(word) - 1:
return True
board[i][j] = ''
res = dfs(i-1, j, k+1) or dfs(i+1, j, k+1) or dfs(i, j-1, k+1) or dfs(i, j+1, k+1)
board[i][j] = word[k]
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i, j, 0):
return True
return False
复杂度分析:
时间复杂度:O(3^K MN),其中M,N为二维数组的row,col长度,K为word长度,因为每一次有上下左右四个方向选择,考虑上一个字符来的方向,因此有3种选择 空间复杂度:O(K)