给定一个二维网格和一个单词,找出该单词是否存在于网格中。
単語はアルファベット順に並べ、隣接するセルの文字で形成する必要があります。「隣接する」セルとは、水平方向または垂直方向に隣接するセルのことです。同じセル内の文字は再利用できません。
例:
ボード= [ ['A'、 'B'、 'C'、 'E']、 ['S'、 'F'、 'C'、 'S']、 ['A'、 'D'、 'E '、' E '] ] 与えられた単語= " ABCCED "、trueを返す 与えられた単語= " SEE "、trueを返す 与えられた単語= " ABCB "、falseを返す
促す:
board
またword
、大文字と小文字のみが含まれています。1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
DFS +バックトラッキング
2次元のテーブルを見ると、DFSと考えられます。DFSは2次元のテーブル全体をトラバースします。DFSは、現在の位置が単語の先頭の文字であるときに実行されます。同時に、vis配列が追加され、訪問された位置が示されます。その後、いくつかの判断条件が追加されます。
コード
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