(python version) 劍指offer 12.矩阵中的路径

題目描述

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。例如abcesfcsadee 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字符串的第一個字符b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。

解題筆記

  • 题目理解 input:是一个字符串,变成矩阵的形式(可以用画的)
  • 回溯法:
    • 判断该路径是否存在在二维矩阵当中,回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。
    • 通常回溯法适合用递归实现代码。
    • 对使用过的字符进行标记后 (不走回头路)和处理后的去标记(变回正常 => 返回上一层重找)。
  • condition
    • 判断当前是否符合 path[0]
    • 接著判断上下左右找寻是否符合 (ps. 已实验:上下左右的先后顺序并无差异)
测试案例1(第一次找到的c往下找没有结果; 返回上一层重找)

matrix = ‘dklajfncejcd’
rows =3
cols =4
path = ‘klncj’

测试案例2 (不走回头路)

matrix = ‘ABCESFCSADEE’
rows =3
cols =4
path = ‘ABCB’

Python代碼

class Solution:
    def hasPath(self, matrix, rows, cols, path):
        # write code here
        if not matrix:
            return False
        if not path:
            return True
        matrix = list(matrix)
        matrix = [matrix[i*cols: (i+1)*cols] for i in range(rows)]
        for i in range(rows):
            for j in range(cols):
                if self.exist_condition(matrix, i, j, path):
                    return True
        return False

    def exist_condition(self, matrix, i, j, path):
        # 调用自己做递归
        if matrix[i][j] == path[0]:
            if not path[1:]:
                return True
            matrix[i][j] = '' # 这边设定是为了防止下面递回往回找的时候会走回头路

            # 向右
            if j>0 and self.exist_condition(matrix, i, j-1, path[1:]):
                return True
            # 向左
            if j< len(matrix[0])-1 and self.exist_condition(matrix, i, j+1, path[1:]):
                return True
            # 向上
            if i>0 and self.exist_condition(matrix, i-1, j, path[1:]):
                return True
            # 向下
            if i< len(matrix)-1 and self.exist_condition(matrix, i+1, j, path[1:]):
                return True
            matrix[i][j] = path[0] # 判断式完成之后,还给原本 matrix 原本的值 (回到上一层的概念)
            return False
        else:
            return False # 回到递归 / 主函式for循环找别的位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值