给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 给定 word = "ABCCED", 返回 true 给定 word = "SEE", 返回 true 给定 word = "ABCB", 返回 false
提示:
-
board
和word
中只包含大写和小写英文字母。 1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
DFS+回溯
看到二维表就想到DFS,遍历整个二维表,当前位置为word开头字母时才执行DFS,同时还要加一个vis数组表示已访问的位置,然后加一些判断条件剪枝。
Code
def exist(self, board: List[List[str]], word: str) -> bool:
def dfs(x, y, tmp):
nonlocal flag
if tmp == word:
flag = True
return
if not (0 <= x < rowLength and 0 <= y < colLength):
return
if flag or vis[x][y] or board[x][y] != word[len(tmp)]:
return
vis[x][y] = True
dfs(x + 1, y, tmp + board[x][y])
dfs(x - 1, y, tmp + board[x][y])
dfs(x, y + 1, tmp + board[x][y])
dfs(x, y - 1, tmp + board[x][y])
vis[x][y] = False
rowLength, colLength, flag = len(board), len(board[0]), False
vis = [[False for _ in range(colLength)] for _ in range(rowLength)]
for i in range(rowLength):
for j in range(colLength):
if board[i][j] == word[0]:
dfs(i, j, '')
if flag:
return flag
return flag