请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路,主函数设计循环从矩阵的每个位置开始调用辅助函数判断以此位置开始是否有这条路径。
辅助函数判断开始位置上下左右移动是否和路径一致,判断边界,出栈之后将路径记录重置。
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here if matrix == '' or rows <= 0 or cols <= 0 or path == '': return False #记录路径是否走过 flag = [0]*len(matrix) for i in xrange(rows): for j in xrange(cols): #如果有一个路径满足,则返回True if self.finPath(matrix, rows, cols, i, j, path, flag, 0): return True del flag return False def finPath(self, matrix, rows, cols, i, j, path, flag, k): index = i * cols + j if i < 0 or j < 0 or i >= rows or j >= cols or k > len(path)-1 or path[k] != matrix[index] or flag[index] == 1: return False #走到最后一位返回True if k == len(path)-1: return True flag[index] = 1 #上下左右 if self.finPath(matrix, rows, cols, i+1, j, path, flag, k+1) or \ self.finPath(matrix, rows, cols, i-1, j, path, flag, k+1) or \ self.finPath(matrix, rows, cols, i, j+1, path, flag, k+1) or \ self.finPath(matrix, rows, cols, i, j-1, path, flag, k+1): return True #出栈重置 flag[index] = 0 #完全出栈还没有返回值,说明不存在这条路径 return False so = Solution() matrix = 'ABCESFCSADEE' matrix = ''.join(matrix) path = 'ABCB' path = ''.join(path) print so.hasPath(matrix, 3, 4, path)