题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路:回溯法
1. 在矩阵中任选一个格子作为路径的起点。假设矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字符正好是ch,那么到相邻的格子寻找路径上的第i+1个字符。除矩阵边界上的格子之外,其他格子都有4个相邻的格子。重复这个过程,直到路径上的所有字符都在矩阵中找到相应的位置。
2. 回溯法具有递归性,路径可以被看成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这时候只好在路径上回到第n-1个字符,重新定位n个字符。
3. 路径不能重复进入格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入了每个格子。
# -*- coding:utf-8 -*-
class Solution:
def hasPath(self, matrix, rows, cols, path):
# write code here
for i in range(rows):
for j in range(cols):
if matrix[i*cols+j]==path[0]:
if self.find(list(matrix), rows, cols, path[1:],i,j):
return True
return False
def find(self, matrix, rows, cols, path, i, j):
if not path:
return True
matrix[i*cols+j] = "0"
if j+1<cols and matrix[i*cols+j+1]==path[0]:
return self.find(matrix, rows, cols, path[1:],i,j+1)
elif j-1>=0 and matrix[i*cols+j-1] == path[0]:
return self.find(matrix, rows, cols, path[1:],i,j-1)
elif i+1<rows and matrix[(i+1)*cols+j] == path[0]:
return self.find(matrix, rows, cols, path[1:],i+1,j)
elif i-1>=0 and matrix[(i-1)*cols+j] == path[0]:
return self.find(matrix, rows, cols, path[1:],i-1,j)