题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
解题思路:同样也是回溯,只不过这里回溯的方法是采样修改访问标记的方法,而不是修改输出的方法,代码如下:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
n, m = len(board), len(board[0])
visited = [[False] * m for _ in range(n)]
direc = [0, -1, 0, 1, 0]
def traceback(x, y, i):
if x < 0 or y < 0 or x >= m or y >= n or visited[y][x] or board[y][x] != word[i]:
return False
if i == len(word) - 1:
return True
visited[y][x] = True
for k in range(4):
tx = x + direc[k]
ty = y + direc[k+1]
if traceback(tx, ty, i+1):
return True
visited[y][x] = False
return False
for i in range(n):
for j in range(m):
if board[i][j] == word[0] and traceback(j, i, 0):
return True
return False