描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 \begin{bmatrix} a & b & c &e \\ s & f & c & s \\ a & d & e& e\\ \end{bmatrix}\quad⎣⎡asabfdcceese⎦⎤ 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
讨论组题解方法是说关于回溯和深度优先遍历,深度优先遍历之前的题目有提到过,这里先了解一下什么是回溯?
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
回溯法的图形示例在:https://www.jianshu.com/p/dd3c3f3e84c0
我觉得可以理解成枚举法,先假定一种开始,然后从这个开始往后推演,如果行不通,就换一种开始方法。
另外关于回溯和深度优先遍历的区别:https://blog.csdn.net/gardenpalace/article/details/84625537这篇博客有详细的解释。
主要是关于开始的次序不同、访问的次数不同以及剪枝不同。
综上,讨论组给出的题解为:
①首先做边界判断
②然后就是在矩阵中向左,向右,向上,向下移动一个格子。
③如果以matrix[i][j]开头找到了一条路径就输出该结果。
class Solution:
def dfs(self, matrix, word, i, j, pos):
if i < 0 or i == len(matrix) or j < 0 or j == len(matrix[0]) or matrix[i][j] != word[pos]:
return False
if pos == len(word) - 1:
return True
tmp, matrix[i][j] = matrix[i][j], '.'
ret = self.dfs(matrix, word, i, j - 1, pos + 1) or self.dfs(matrix, word, i, j + 1, pos + 1) \
or self.dfs(matrix, word, i - 1, j, pos + 1) or self.dfs(matrix, word, i + 1, j, pos + 1)
matrix[i][j] = tmp
return ret
def hasPath(self, matrix, word):
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if self.dfs(matrix, word, i, j, 0): # 如果以matrix[i][j]开头找到了一条路径!
return True
return False