回溯算法
添加备注
class Solution:
directions = [(-1, 0), (1, 0), (0,-1), (0, 1)]
def exist(self, board: List[List[str]], word: str) -> bool:
row = len(board)
col = len(board[0])
visited = [[0] * col for _ in range(row)]
cur_i, cur_j = 0, 0
for i in range(row):
for j in range(col):
if board[i][j] == word[0]:
cur_i = i
cur_j = j
visited[i][j] = 1
if self.backtrack(board, word[1:], cur_i, cur_j, visited):
return True
else:
visited[i][j] = 0
return False
def backtrack(self, board, word, i, j, visited):
# 终止条件
if word == "":
return True
# 遍历每个方向
for direct in self.directions:
cur_i = i + direct[0]
cur_j = j + direct[1]
# 没越界,且匹配字符
if cur_i >=0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:
# 不能重复访问
if visited[cur_i][cur_j] == 1:
continue
# 标记为已使用
visited[cur_i][cur_j] = 1
# 后面的位置也匹配,返回true
if self.backtrack(board, word[1:], cur_i, cur_j, visited):
return True
else:
# 后面不匹配,回溯,上一个位置的其他方向
visited[cur_i][cur_j] = 0
return False
class Solution:
find = False
def exist(self, board: List[List[str]], word: str) -> bool:
row = len(board)
col = len(board[0])
visited = [[0] * col for _ in range(row)]
cur_i, cur_j = 0, 0
for i in range(row):
for j in range(col):
self.dfs(board, word, i, j, visited, 0)
return self.find
def dfs(self, board, word, i, j, visited, word_index):
# print(i, j)
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or visited[i][j] or board[i][j] != word[word_index]:
return
if word_index == len(word) - 1:
self.find = True
return
visited[i][j] = 1
self.dfs(board, word, i + 1, j, visited, word_index + 1) or self.dfs(board, word, i - 1 , j, visited, word_index + 1) or self.dfs(board, word, i, j - 1, visited, word_index + 1) or self.dfs(board, word, i, j + 1, visited, word_index + 1)
visited[i][j] = 0