79. 单词搜索(中等)-回溯

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

分析

  • python判断区间可以用一个表达式
  • 可以通过改变原来的矩阵,减少外界空间占用
class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        # 学习到了两点,python判断区间可以一个表达式
        # 可以通过对原始矩阵改变然后在恢复来避免额外的空间占用

        m, n = len(board), len(board[0])

        word_n = len(word)

        def backtrack(i, j, k):
            # 一般可以在这里设置停止条件,最后一个条件也是剪枝
            if not 0 <= i < m or not 0 <= j < n or board[i][j] != word[k]:
                return False
            
            if k == word_n - 1:
                print(k)
                return True
            
            board[i][j], tmp = "/", board[i][j]
            res = backtrack(i - 1, j, k + 1) or backtrack(i + 1, j, k + 1) or  backtrack(i, j - 1, k + 1) or backtrack(i, j + 1, k + 1)
            board[i][j] = tmp

            return res
        
        for i in range(m):
            for j in range(n):
                if backtrack(i, j, 0): return True

        return False
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容