剑指offer刷题笔记-12 矩阵中的路径

在这里插入图片描述
此题能想到的思路是遍历矩阵,以每个节点为开始用回溯法去分别以上,下,左,右为起始节点,去判断word[1:]是否存在。已经访问过的节点的字母,用特殊符号替代。
但是在具体实施上没有能很快想清楚,主要是利用多指针移动的思维没有建立,需要多加练习。总结一下理清思路的办法:回溯法需要考虑以下几点:1. 结束条件: 当表示矩阵节点位置的指针越界时,return false。当当前矩阵节点的符号和word中当前字母不同时,return false。 当当前节点以访问过,return false。 当前面几个条件均未返回false,且当前已经访问到word中最后一个字母时,return true。
2. 需要传入function的variable:不用传入整个board矩阵,只需要传入表示当前位置的index i,j。以及表示当前搜索的字母在word中的index k。我原先太拘泥于题目给出的主函数的input,其实可以在给出的主函数中再定义自己的函数作为被循环调用的函数。
3. 递归工作: 主要是传入子问题的variable的变化。此题中,需要去调用函数访问上下左右四个节点,每个节点就是用指针i,j的变化表示。有一点容易忽视的是替换掉的已经访问的节点在访问结束时需要restore,只有子节点看到的祖先节点是被替换过的

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        def check(i,j,k):
            if not 0<=i<len(board) or not 0<=j<len(board[0]) or board[i][j] != word[k]: #可以用not来避免写两端分开的区间 
                return False
            elif k == len(word)-1:  #如果访问到最后一个字母并且匹配,匹配的判断在上面的if中
                return True

            tmp, board[i][j] = board[i][j], '#' #替换已访问节点
            res = check(i,j+1,k+1) or check(i+1,j,k+1) or check(i-1,j,k+1) or check(i,j-1,k+1)
            board[i][j] = tmp  #restore visited node
            return res

        for i in range(len(board)):
            for j in range(len(board[0])):
                if check(i,j,0): return True # 有一个匹配找到就返回true

        return False    #全部节点都未匹配,false

猜你喜欢

转载自blog.csdn.net/baidu_37360677/article/details/108571866
今日推荐