剑指offer:矩阵中的路径Python

思路梗概:

  1. 从m*n矩阵里面找到第一个与word[0]匹配的字母;设置i,j分别为当前位置的横纵坐标轴,k为要匹配的word的索引值。

所以代码应该是:

for i in range(board):
    for j in range(board[0]):
        if dfs(i, j, 0): return True

要点:从k=0的位置先找到第一个匹配的位置。

  1. 对于当前位置board[i][j]的值:

  1. 如果当前位置的值不等于第一个word中的字母,返回False

  1. 如果当前索引i,和j超过了矩阵board1的行数和列数,则返回False(这一步暂时还不清楚为啥,前面已经限定i和j的范围了,为什么还会超出范围呢?但是不加上这一步过不了测试案例)

  1. 如果当前word[0]已经匹配了,后面要继续word[1]的匹配。

if board[i][j] != word[k] or not 0 <= i < len(board) or not 0 <= j < len(board[0]): return False
  1. 对于word[1]的匹配来说,要注意以下几个点:

  1. 对board[i][j]中的四个方向进行判断能不能匹配到word[1]

  1. 为了避免重复返回board[i][j],我们要暂时将board[i][j]置为空值,这一次遍历之后还原回来;

这部分代码:

board[i][j] = "#"
res = dfs(i-1, j, k+1) or dfs(i+1, j) or dfs(i, j-1, k+1) or dfs(i, j+1, k+1)# res是bool类型
board[i][j] = word[k]
  1. 最后如果全部word值都匹配完成,则返回True

if k = len(word) -1: return True

所以总的代码如下:

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        def dfs(i, j, k):
            if not 0 <= i <len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
            if k == len(word)-1: return True
            board[i][j] = '#'
            res = dfs(i-1, j, k+1) or dfs(i+1, j, k+1) or dfs(i, j-1, k+1) or dfs(i, j+1, k+1)
            board[i][j] = word[k]
            return res
        
        for i in range(len(board)):
            for j in range(len(board[0])):
                if dfs(i, j, 0): return True
        return False

猜你喜欢

转载自blog.csdn.net/m0_55780358/article/details/129156066