题目:
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
数据范围:0 ≤ n,m ≤ 20 ,1 ≤ len ≤ 25
思路:
1、先做输入矩阵和字符串检测范围;
2、先根据拿到的字符串,先匹配起点,在矩阵中找到字符串首字母位置,然后根据这个位置,向四个方向(上下左右)位置的值进行匹配,是否符合后一个字母值;
3、注意处理下标越界、字符不匹配、已经遍历过不能重复这三个情况,第一个情况是碰到边界,则需要返回原始位置,第二个情况是查询方向上的值与匹配值不等,则返回原始位置,第三个情况是匹配的方向已经被之前查询匹配过了,也需要返回原始位置;
4、可以使用递归来处理。
def hasPath(self, matrix: List[List[str]], word: str) -> bool:
# write code here
if len(matrix) <= 20 and len(matrix[0]) >= 0 and 1 <= len(word) <= 25:
n = len(matrix)
m = len(matrix[0])
flag = [[False for i in range(m)] for j in range(n)]
for i in range(n):
for j in range(m):
if self.dfs(matrix, n, m, i, j, word, 0, flag):
return True
return False
先对矩阵每个位置标记flag用作判断是否已经匹配过了
然后双层遍历可得到矩阵位置(i,j),进入寻找函数dfs
dfs()方法参数matrix是矩阵,n和m是矩阵长款,i和j是当前位置,word是输入字符串,0是当前匹配的字符串位置,flag是矩阵标记
def dfs(
self,
matrix: List[List[str]],
n: int,
m: int,
i: int,
j: int,
word: str,
k: int,
flag: List[List[bool]],
) -> bool:
if (
i < 0
or i >= n
or j < 0
or j >= m
or (matrix[i][j] != word[k])
or flag[i][j]
):
return False
if k == len(word) - 1:
return True
flag[i][j] = True
if (
self.dfs(matrix, n, m, i - 1, j, word, k + 1, flag)
or self.dfs(matrix, n, m, i + 1, j, word, k + 1, flag)
or self.dfs(matrix, n, m, i, j - 1, word, k + 1, flag)
or self.dfs(matrix, n, m, i, j + 1, word, k + 1, flag)
):
return True
flag[i][j] = False
return False
第一个条件判断,就是需要判断的三个情况,判断位置是否越界、该位置的值与字符串当前位置的值是否不相等、是否是匹配过的位置,如果有一种情况满足就返回False
经过第一个条件判断的,只能是没越界的,当前值相等的,未匹配过的情况,所以如果匹配的值是字符串最后一个字符,则返回True,若是还没匹配到最后一个字符,首先先把匹配过的标记打上
第三个条件判断,是处理该位置上的四个方向是否能匹配k位置的下一个字符,进行递归
若是这个字符串从这个位置作为起点无法形成路径,则把该位置重新初始化标记,返回Fales,到第二个遍历的起点位置再进行判断,若是在hasPath()方法遍历完所有作为起点的位置都没找到路径,则返回False