【leetcode 66题 之 12 矩阵中的路径】
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
该题目属于回溯法范畴,个人理解回溯法,相当于走迷宫,从入口进来,找到一个和指定路径相同的起始点,然后在该点的上、下、左、右寻找。若找到匹配到第二个字符的点,就进入下一个路口,继续寻找;若走出去好几个点发现找错了,可以一直回溯到当初走错的点,重新寻找,直到找到与指定路径相同的路径。
以上纯粹为个人的理解,若有不当之处,请严厉指出。
回到本题:
首先我需要一个外层的查找函数,遍历全部的点,这就需要两个嵌套的for循环,依次查找。
其次我需要一个用于替换字符串指定索引下字符的函数,因为走过的与原路径匹配的点需要标识走过,防止下面情况的出现:
ABCESFCSADEE 是找不到 ABCB 这个路径的,但是如果回找,第一行 A -> B -> C -> B,这里这个B是走过的,不能再访问。
最后用一个递归函数查找路径。
代码如下:
[code]# -*- coding:utf-8 -*- class Solution: def subb(self,string, p, c): new = [] for s in string: new.append(s) new[p]测试用例:= c return ''.join(new) def hasPathCore(self, matrix, rows, cols, row, col, path): """ 递归查找 :param matrix: :param rows: :param cols: :param row: :param col: :param path: :return: 是否有相关的路径 """ if len(path) == 0: return True hasPath = False if row >= 0 and row < rows and col >= 0 and col < cols and matrix[ row * cols + col] == path[0]: matrix = self.subb(matrix,row * cols + col,'0') hasPath = self.hasPathCore(matrix, rows, cols, row - 1, col, path[1:]) \ or self.hasPathCore(matrix, rows, cols, row + 1, col, path[1:]) \ or self.hasPathCore(matrix, rows, cols, row, col + 1, path[1:]) \ or self.hasPathCore(matrix, rows, cols, row, col - 1, path[1:]) return hasPath def hasPath(self, matrix, rows, cols, path): # write code here if matrix is None or len(matrix) == 0 or rows < 1 or cols < 1 or path is None or len(path) == 0: return False for i in range(rows): for j in range(cols): if (matrix[i * cols + j] == path[0]): if self.hasPathCore(matrix,rows,cols,i,j,path): return True return False
[code]if __name__ == '__main__': s = Solution() print(s.hasPath(['a','b','c','e','s','f','c','s','a','d','e','e'],3,4,"abcb")) print(s.hasPath("ABCESFCSADEE",3,4,"ABCCED")) print(s.hasPath("ABCESFCSADEE",3,4,"SEE")) print(s.hasPath(['a','b','t','g','c','f','c','s','j','d','e','h'],3,4,"bfcj")) print(s.hasPath("ABCESFCSADEE",3,4,"ABCB"))
输出:
[code]False True True True False
- 《剑指Offer》学习笔记--面试题66:矩阵中的路径
- Leetcode 329. 矩阵中的最长递增路径
- 剑指offer66题(矩阵中的路径)
- 剑指offer面试题12:矩阵中的路径(java实现)
- 面试题66:矩阵中的路径
- 剑指Offer刷题笔记(java实现)_12_矩阵中的路径
- 《剑指offer》面试题66 矩阵中的路径
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
- 【剑指Offer学习】【面试题66:矩阵中的路径】
- 【剑指Offer学习】【面试题66:矩阵中的路径】
- 66 - 矩阵中的路径
- 剑指offer--面试题12:矩阵中的路径
- 剑指offer 66题 矩阵中的路径
- 面试题12:矩阵中的路径
- LeetCode 在矩阵中寻找路径类的动态规划问题
- 面试题12:矩阵中的路径
- 【剑指**】12.矩阵中的路径
- 面试题目66(矩阵中的路径)
- 面试题66. 矩阵中的路径
- LeetCode 高级 - 矩阵中的最长递增路径