# 使用回溯算法
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 单词搜索
最新推荐文章于 2024-07-12 00:09:49 发布