1. 程式人生 > >LeetCode Meidum 79 搜尋單詞 Python

LeetCode Meidum 79 搜尋單詞 Python

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