递归
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
self.lx = len(board) - 1
self.ly = len(board[0]) - 1
m = len(board)
n = len(board[0])
# 不允许重复使用字母
seen = [[0 for i in range(n)] for j in range(m)]
for i in range(m):
for j in range(n):
if self.search(board, word, 0, i, j, seen):
return True
return False
# word[index:] 与 board[x][y]开头的所有情况 是否匹配?
def search(self, board, word, index, x, y, seen):
# 坐标变换方式 上 右 下 左
d = [(-1, 0), (0, 1), (1, 0), (0, -1)]
# 当前search的是word最后一个字符
if index == len(word) - 1:
return board[x][y] == word[index]
# 当前search的不是word最后一个字符
# 若匹配 须递归查看后面的字符是否匹配
# 若不匹配 返回False
if board[x][y] == word[index]:
seen[x][y] = 1
for i in range(4):
x_ = x + d[i][0]
y_ = y + d[i][1]
if 0 <= x_ <= self.lx and 0 <= y_ <= self.ly and not seen[x_][y_] and self.search(board, word, index+1, x_, y_, seen):
return True
# 上右下左 递归完之后没有匹配的单词 还原seen
seen[x][y] = 0
# word[index:] 与 board[x][y]开头的所有情况 不匹配
return False