题意:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路:
记忆化搜索dfs或者bfs
内存可以用hash表优化 但是没有必要
注意边界条件
code:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
n, m, l = len(board), len(board[0]), len(word)
directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
visited = [[False] * m for _ in range(n)]
ans = l*[' ']
def dfs(x, y, dis):
if dis == l:
return True
for dit in directs:
xx, yy = x + dit[0], y + dit[1]
if 0<= xx and xx < n and 0<= yy and yy < m and visited[xx][yy] == False \
and board[xx][yy] == word[dis]:
ans[dis] = board[xx][yy]
visited[xx][yy] = True
if dfs(xx, yy, dis + 1) == True:
return True
visited[xx][yy] = False
return False
for i in range(n):
for j in range(m):
ans[0] = board[i][j]
if ans[0] == word[0]:
visited[i][j] = True
if dfs(i, j, 1) == True:
return True
visited[i][j] = False
return False