python3 剑指刷题记录10

题目:
        请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
        数据范围:0 ≤ n,m ≤ 20 ,1 ≤ len ≤ 25 

思路:

        1、先做输入矩阵和字符串检测范围;

        2、先根据拿到的字符串,先匹配起点,在矩阵中找到字符串首字母位置,然后根据这个位置,向四个方向(上下左右)位置的值进行匹配,是否符合后一个字母值;

        3、注意处理下标越界、字符不匹配、已经遍历过不能重复这三个情况,第一个情况是碰到边界,则需要返回原始位置,第二个情况是查询方向上的值与匹配值不等,则返回原始位置,第三个情况是匹配的方向已经被之前查询匹配过了,也需要返回原始位置;

        4、可以使用递归来处理。

def hasPath(self, matrix: List[List[str]], word: str) -> bool:
        # write code here
        if len(matrix) <= 20 and len(matrix[0]) >= 0 and 1 <= len(word) <= 25:
            n = len(matrix)
            m = len(matrix[0])
            flag = [[False for i in range(m)] for j in range(n)]
            for i in range(n):
                for j in range(m):
                    if self.dfs(matrix, n, m, i, j, word, 0, flag):
                        return True
        return False

先对矩阵每个位置标记flag用作判断是否已经匹配过了

然后双层遍历可得到矩阵位置(i,j),进入寻找函数dfs

dfs()方法参数matrix是矩阵,n和m是矩阵长款,i和j是当前位置,word是输入字符串,0是当前匹配的字符串位置,flag是矩阵标记

def dfs(
        self,
        matrix: List[List[str]],
        n: int,
        m: int,
        i: int,
        j: int,
        word: str,
        k: int,
        flag: List[List[bool]],
    ) -> bool:
        if (
            i < 0
            or i >= n
            or j < 0
            or j >= m
            or (matrix[i][j] != word[k])
            or flag[i][j]
        ):
            return False
        if k == len(word) - 1:
            return True
        flag[i][j] = True
        if (
            self.dfs(matrix, n, m, i - 1, j, word, k + 1, flag)
            or self.dfs(matrix, n, m, i + 1, j, word, k + 1, flag)
            or self.dfs(matrix, n, m, i, j - 1, word, k + 1, flag)
            or self.dfs(matrix, n, m, i, j + 1, word, k + 1, flag)
        ):
            return True
        flag[i][j] = False
        return False

第一个条件判断,就是需要判断的三个情况,判断位置是否越界、该位置的值与字符串当前位置的值是否不相等、是否是匹配过的位置,如果有一种情况满足就返回False

经过第一个条件判断的,只能是没越界的,当前值相等的,未匹配过的情况,所以如果匹配的值是字符串最后一个字符,则返回True,若是还没匹配到最后一个字符,首先先把匹配过的标记打上

第三个条件判断,是处理该位置上的四个方向是否能匹配k位置的下一个字符,进行递归

若是这个字符串从这个位置作为起点无法形成路径,则把该位置重新初始化标记,返回Fales,到第二个遍历的起点位置再进行判断,若是在hasPath()方法遍历完所有作为起点的位置都没找到路径,则返回False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值