题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例
示例 1:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解答方法
方法一:dfs回溯法
思路
代码
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
directs = [[-1,0],[1,0],[0,-1],[0,1]]
m = len(board)
if m == 0:
return False
n = len(board[0])
mark = [[False for _ in range(n)] for _ in range(m)]
def backtrack(mark, x, y, word, index,board):
if index == len(word) -1:
return board[x][y] == word[index]
if board[x][y] == word[index]:
mark[x][y] = True
for direct in directs:
cur_x = x + direct[0]
cur_y = y + direct[1]
if cur_x >=0 and cur_x < m and cur_y >= 0 and cur_y < n and not mark[cur_x][cur_y] and backtrack(mark, cur_x, cur_y, word, index+1, board):
return True
mark[x][y] = False
return False
for i in range(m):
for j in range(n):
if backtrack(mark, i, j, word, 0, board):
return True
return False
时间复杂度
O((m*n)^2)
空间复杂度
O(m*n)
网友评论