# 使用回溯算法
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
# 有个二维列表记录当前位置是否走过
# 记录走过的路径,如果word在走过的路径中,则返回true
self.res = False
# m * n 的矩阵
m = len(board)
n = len(board[0])
mask = self.create_mask(m,n)
# mask[0][0]=1
for i in range(m):
for j in range(n):
# 先找到word的第一个字符,然后开始回溯
if board[i][j] == word[0]:
cur = board[i][j]
mask[i][j] = 1
self.drawback(board[:], i, j, cur[:], mask[:], word[:])
mask[i][j] = 0
return self.res
def drawback(self, board, i, j, cur, mask, word):
if cur != word[:len(cur)]:
return
if cur == word:
if cur == word:
self.res = True
return
# 上、下、左、右四个方位
# 左
if j-1 >= 0 :
if mask[i][j-1] == 0:
cur += board[i][j-1]
mask[i][j-1] = 1
self.drawback(board[:], i, j-1, cur[:], mask[:], word[:])
cur = cur[:-1]
mask[i][j-1] = 0
# 右
if j+1 < len(board[0]):
if mask[i][j+1] == 0:
cur += board[i][j+1]
mask[i][j+1] = 1
self.drawback(board[:], i, j+1, cur[:], mask[:], word[:])
cur = cur[:-1]
mask[i][j+1] = 0
# 上
if i-1 >= 0:
if mask[i-1][j] == 0:
cur += board[i-1][j]
mask[i-1][j] = 1
self.drawback(board[:], i-1, j, cur[:], mask[:], word[:])
cur = cur[:-1]
mask[i-1][j] = 0
# 下
if i+1 < len(board):
if mask[i+1][j] == 0:
cur += board[i+1][j]
mask[i+1][j] = 1
self.drawback(board[:], i+1, j, cur[:], mask[:], word[:])
cur = cur[:-1]
mask[i+1][j] = 0
return
def create_mask(self,m,n):
mask = [[0 for col in range(n)] for row in range(m)]
return mask[:]
力扣-79 单词搜索
最新推荐文章于 2025-06-29 10:48:52 发布
该博客介绍了一个Python类`Solution`,实现了回溯算法来检查给定的二维字符矩阵中是否存在指定的单词。算法通过遍历矩阵并标记已访问的位置,从匹配到的第一个字符开始进行深度优先搜索,探索所有可能的路径。当找到完整的单词时,返回`True`,否则返回`False`。
263

被折叠的 条评论
为什么被折叠?



