回溯
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
self.res = False
self.col, self.row = len(board[0]), len(board)
flag = [[False]*self.col for _ in range(self.row)] # 标记矩阵,看有没有使用过
self.board = board
def backtrack(i,j,flag, word): #flag矩阵标记此次的使用状况,word是还剩下需要找的字符串
if len(word) == 0:
self.res = True
return
if self.res == True: return
# 这部分可以写个4*2的数组来优化下
if i-1 >= 0 and flag[i-1][j] == False and self.board[i-1][j] == word[0]:# 目前位置的左边没用过,并且跟下一个单词相同
flag[i-1][j] = True
backtrack(i-1,j, flag, word[1:])
flag[i-1][j] = False # flag的状态回溯
if j-1 >= 0 and flag[i][j-1] == False and self.board[i][j-1] == word[0]:# 目前位置的上边没用过,并且跟下一个单词相同
flag[i][j-1] = True
backtrack(i,j-1, flag, word[1:])
flag[i][j-1] = False
if j+1 < self.col and flag[i][j+1] == False and self.board[i][j+1] == word[0]:# 目前位置的右边没用过,并且跟下一个单词相同
flag[i][j+1] = True
backtrack(i,j+1, flag, word[1:])
flag[i][j+1] = False
if i+1 < self.row and flag[i+1][j] == False and self.board[i+1][j] == word[0]:# 目前位置的下边没用过,并且跟下一个单词相同
flag[i+1][j] = True
backtrack(i+1,j, flag, word[1:])
flag[i+1][j] = False
for i in range(self.row):
for j in range(self.col):
if board[i][j] == word[0]: # 从第一个字母开始,找到起始位置
flag[i][j] = True
backtrack(i, j, flag, word[1:])
flag[i][j] = False
return self.res
竟然过了嘻嘻