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

猜你喜欢

转载自blog.csdn.net/qq_28327765/article/details/86156701