79. 单词搜索(中)

发布时间 2024-01-07 15:13:04作者: Frommoon

题目

  • 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

题解:回溯

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        if not board:   # 边界条件
            return False
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.backtrack(board, i, j, word):#表示从当前位置 (i, j) 开始,搜索能否匹配整个单词 word。
                    return True
        return False

    def backtrack(self, board, i, j, word):
        if len(word) == 0: # 如果单词已经检查完毕
            return True
        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or word[0] != board[i][j]:  # 如果路径出界或者矩阵中的值不是word的首字母,返回False
            return False
        tmp = board[i][j]  # 保存当前位置的值
        board[i][j] = '0'  #做选择
        #将四个方向的搜索结果进行合并。如果其中任意一个方向的搜索返回 True,则表示找到了满足条件的路径,将 res 设置为 True。
        res = self.backtrack(board,i+1,j,word[1:]) or self.backtrack(board,i-1,j,word[1:]) or self.backtrack(board,i,j+1,word[1:]) or self.backtrack(board, i, j-1, word[1:]) # 上下左右四个方向搜索,递归 

        board[i][j] = tmp  # 标记过的点恢复原状,以便进行下一次搜索,撤销选择
        return res#res 是一个布尔值变量,用于存储回溯搜索的结果。它表示在当前位置 (i, j) 上,是否存在一条路径可以匹配整个单词 word。