LeetCode Meidum 79 搜尋單詞 Python
阿新 • • 發佈:2019-01-13
def exist(self, board, word): """ My Method 演算法:回溯 思路: 比較典型的回溯題的思路,從某個位置出發看看某一處是否滿足要求,在某個位置肯定是用BFS,對周圍四個 位置進行判斷是否滿足要求,如果滿足要求的話就進一步bfs,每一次bfs判斷一個字元,所以要有index來記錄當前 判斷的是哪個字元,向下傳入index+1,並且bfs的返回值應該是bool型別的,把bfs加入到if的判斷條件中, 在四周的四個方向進行探索,如果某個位置可行,就可以 return True了,如果四個位置都不可行,才 return False。 注意要在探索的位置處用visited陣列來記錄探索的狀態,避免造成迴圈,訪問過的位置置True ❗️❗️❗️: 並且如果某個位置不可行,要return False的時候,一定要把visited[i][j] = True置False,這樣才可以保障 回溯的時候,回溯到某一個位置visited還是原來的狀態,因為如果某次探索對i,j置visited了並且這次探索的路徑是錯的, 那麼也會將i,j的visited置True導致回溯後下一次再從其他位置探索過來的時候由於此處i,j的visited已經是True了就不 會再進行探索了。而i,j這個位置實際上是應該囊括在某一個解的路徑中的。 回溯一定要注意儲存好回溯當前的狀態!!! 然後就是外面會有一個迴圈從所有符合word[0]的位置開始BFS """ if word == '': return True if board == [] or board[0] == []: return False m = len(board) n = len(board[0]) def bfs(x, y, index): i, j = x, y visited[x][y] = True if index == len(word) - 1: return True for x, y in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]: if x >= 0 and x <= m - 1 and y >= 0 and y <= n - 1 and not visited[x][y]: if board[x][y] == word[index + 1] and bfs(x, y, index + 1): return True visited[i][j] = False return False visited = [[False] * n for _ in range(m)] for i in range(m): for j in range(n): if board[i][j] == word[0] and bfs(i, j, 0): return True return False def exist1(self, board, word): """ Disscussion Method 思路差不多,也是從4個方向進行探索,他這裡雖然說是DFS,但是也和我理解的BFS差不多,都是從i,j位置的4個方向進行探索 倒是這裡用board本身而不借助visited陣列,這個會省一點時間 """ if not board: return False for i in range(len(board)): for j in range(len(board[0])): if self.dfs(board, i, j, word): return True return False # check whether can find word, start at (i,j) position def dfs(self, board, i, j, word): if len(word) == 0: # all the characters are checked return True if i<0 or i>=len(board) or j<0 or j>=len(board[0]) or word[0]!=board[i][j]: return False tmp = board[i][j] # first character is found, check the remaining part board[i][j] = "#" # avoid visit agian # check whether can find "word" along one direction res = self.dfs(board, i+1, j, word[1:]) or self.dfs(board, i-1, j, word[1:]) \ or self.dfs(board, i, j+1, word[1:]) or self.dfs(board, i, j-1, word[1:]) board[i][j] = tmp return res