leetcode —— 面试题12. 矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        if not board:
            return False
        if not word:
            return True
        rows = len(board)
        cols = len(board[0])
        flag = [[0 for _ in range(cols)] for _ in range(rows)]  # 用于标记是否已经检索过
        
        def func(matrix,string,lens,nr,nc):  # 深度优先遍历,判断字符串是否可达
            if lens == len(string):  # 递归停止条件,当遍历到最后一个元素之后,就可证明字符串是可大的
                return True
            haspath = False  
            if  0<=nr<rows and 0<=nc<cols and board[nr][nc]==string[lens] and flag[nr][nc]==0:  # 当前字符是否满足条件
                flag[nr][nc]=1  # 如果未被检索同时符合要求
                lens+=1 # 遍历下一个元素
                haspath = func(matrix,string,lens,nr-1,nc) or func(matrix,string,lens,nr+1,nc) or func(matrix,string,lens,nr,nc-1) or func(matrix,string,lens,nr,nc+1)  # 使用递归函数
                if not haspath:  # 如果找不到符合的字符,使用回溯
                    lens-=1
                    flag[nr][nc]=0
            return haspath  # 字符串是否可达的标志
        
        strs = 0
        for i in range(rows):
            for j in range(cols):
                if func(board,word,strs,i,j):
                    return True
        return False
发布了320 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37388085/article/details/105431088