描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例1
输入:
[[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcced”
复制
返回值:
true
回溯算法:
遍历矩阵中的每一个点,然后对每个点从他的上下左右四个方向走
class Solution:
def solution(self,matrix,word,i,j,index):
#当前点是未遍历的。如果word的每个字符都查找完了,直接返回true
if index == len(word):
return True
row = len(matrix)
col = len(matrix[0])
#边界的判断,如果越界直接返回false
if i<0 or i>=row or j<0 or j>=col:
return False
#当前值和word值匹配上了
if matrix[i][j] == word[index]:
#把当前坐标的值保存下来,为了在最后复原
tmp = matrix[i][j]
#修改当前值坐标,表示已经遍历过的点不能再次遍历
matrix[i][j] = 0
#匹配当前值的上下左右和word的下一个字符是否相等
if self.solution(matrix,word,i+1,j,index+1) or \
self.solution(matrix,word,i-1,j,index+1) or \
self.solution(matrix,word,i,j+1,index+1) or \
self.solution(matrix,word,i,j-1,index+1):
return True
#对矩阵进行复原
matrix[i][j] = tmp
#当前值和word值没有匹配上
return False
def hasPath(self , matrix , word ):
if not matrix[0] or not word:
return False
row = len(matrix)
col = len(matrix[0])
for i in range(row):
for j in range(col):
#遍历矩阵中的每个点
if self.solution(matrix,word,i,j,0):
return True
return False