您的位置:首页 > 其它

【leetcode 66题 之 12 矩阵中的路径】

2019-01-10 23:52 169 查看

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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

= 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

[p]测试用例:

[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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: