leetcode79_单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]

给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.

要按我之前说的,这种不需要给出具体路径的问题是不是可以用动态规划,但是没有看到网上有人给出,所以就做到回溯法为止吧。。。
1, 以当前位置为源流往下摸排所有可以跳到的位置
2, 最终递归返回源流位置
3, 然后再以下面一个位置作为源流位置,重复上述操作

class Solution:
    # 实际就是深度搜索的思想
    def exist(self, board: List[List[str]], word: str) -> bool:
        self.row = len(board)
        self.column = len(board[0])
        for i in range(self.row):
            for j in range(self.column):
                if self.dfs(board, word, i, j, 0):
                    return True
        return False
    
    def dfs(self, board, word, i, j, index):
        # 搜索边界: 已经把单词所有字母看过了,直接return true
        if index == len(word):
            return True
        # 搜索边界: 如果越过了网格边界,或者网格当前的值与word当前字母不匹配,return false
        if i < 0 or i >= self.row or j < 0 or j >= self.column or board[i][j] != word[index]:
            return False
        # 以当前位置为源流
        # 如果以上两条边界都没触碰,说明当前网格值与word当前字母是匹配的, 将网格当前值标记为已访问
        board[i][j] = '*'
        # 往下摸排所有可以跳到的位置
        # 然后在网格点的四周看是否与下一个字母匹配
        if self.dfs(board, word, i-1, j, index+1) or \
           self.dfs(board, word, i, j-1, index+1) or \
           self.dfs(board, word, i+1, j, index+1) or \
           self.dfs(board, word, i, j+1, index+1):
            # 最终递归返回源流位置
            # 回溯复原
            board[i][j] = word[index]
            return True
        else:
            # 最终递归返回源流位置
            # 回溯复原
            board[i][j] = word[index]
            return False
发布了37 篇原创文章 · 获赞 18 · 访问量 6630

猜你喜欢

转载自blog.csdn.net/weixin_40027284/article/details/104820792