时间复杂度(O(n)),思想:深度优先遍历
class Solution:
def exist(self, board: [[str]], word: str) -> bool:
board_pos = {}
for i in range(len(board)):
for j in range(len(board[i])):
ch = board[i][j]
if ch not in board_pos:
board_pos[ch] = set()
board_pos[ch].add((i, j))
word_path = []
for ch in word:
if ch not in board_pos: return False
word_path.append(board_pos[ch])
def get_round_pos(pos):
return ((pos[0] + 1, pos[1]), (pos[0] - 1, pos[1]), (pos[0], pos[1] + 1), (pos[0], pos[1] - 1))
path_tree = []
for start_pos in word_path[0]:
tree = [set(), -1, start_pos, 0]
tree[0].add(start_pos)
path_tree.append(tree)
while len(path_tree) > 0:
curr_tree = path_tree[-1]
path_tree = path_tree[:-1]
if curr_tree[3] + 1 >= len(word_path):
return True
for next_pos in get_round_pos(curr_tree[2]):
if next_pos in word_path[curr_tree[3] + 1] and next_pos not in curr_tree[0]:
next_tree = [set(), curr_tree[2], next_pos, curr_tree[3] + 1]
next_tree[0] = next_tree[0] | curr_tree[0]
next_tree[0].add(next_pos)
path_tree.append(next_tree)
return False