題目描述
請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。例如abcesfcsadee 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字符串的第一個字符b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。
解題筆記
- 题目理解 input:是一个字符串,变成矩阵的形式(可以用画的)
- 回溯法:
- 判断该路径是否存在在二维矩阵当中,回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。
- 通常回溯法适合用递归实现代码。
- 对使用过的字符进行标记后 (不走回头路)和处理后的去标记(变回正常 => 返回上一层重找)。
- condition
- 判断当前是否符合 path[0]
- 接著判断上下左右找寻是否符合 (ps. 已实验:上下左右的先后顺序并无差异)
测试案例1(第一次找到的c往下找没有结果; 返回上一层重找)
matrix = ‘dklajfncejcd’
rows =3
cols =4
path = ‘klncj’
测试案例2 (不走回头路)
matrix = ‘ABCESFCSADEE’
rows =3
cols =4
path = ‘ABCB’
Python代碼
class Solution:
def hasPath(self, matrix, rows, cols, path):
# write code here
if not matrix:
return False
if not path:
return True
matrix = list(matrix)
matrix = [matrix[i*cols: (i+1)*cols] for i in range(rows)]
for i in range(rows):
for j in range(cols):
if self.exist_condition(matrix, i, j, path):
return True
return False
def exist_condition(self, matrix, i, j, path):
# 调用自己做递归
if matrix[i][j] == path[0]:
if not path[1:]:
return True
matrix[i][j] = '' # 这边设定是为了防止下面递回往回找的时候会走回头路
# 向右
if j>0 and self.exist_condition(matrix, i, j-1, path[1:]):
return True
# 向左
if j< len(matrix[0])-1 and self.exist_condition(matrix, i, j+1, path[1:]):
return True
# 向上
if i>0 and self.exist_condition(matrix, i-1, j, path[1:]):
return True
# 向下
if i< len(matrix)-1 and self.exist_condition(matrix, i+1, j, path[1:]):
return True
matrix[i][j] = path[0] # 判断式完成之后,还给原本 matrix 原本的值 (回到上一层的概念)
return False
else:
return False # 回到递归 / 主函式for循环找别的位置