class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
n, m, l = len(board), len(board[0]), len(word)
def dfs(i, j, k):
if not 0 <= i < n or not 0 <= j < m or board[i][j] != word[k]: # 剪枝
return False
if k == l - 1: # 最后一个字符比较完毕, 整体都符合
return True
t, board[i][j] = board[i][j], '&' # 使用`&`, 表示这个位置已经遍历过, 因为word中不会出现这个符号, 递归遇到这个符号时, 肯定不相等, 第一时间剪枝
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] = t # 回溯, 恢复现场
return res
for i in range(n):
for j in range(m):
if dfs(i, j, 0):
return True
return False