矩阵中的路径

矩阵中的路径_牛客网

https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&tqId=11218&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

回溯法,终止条件:越界,不匹配,重复
1.先将matrix字符串映射为字符矩阵;
2.从原字符串中找到第一个跟str[0]相等的字符,得到其对应的在矩阵中的位置[r,c]
1)从[r,c]开始按 上、左、右、下的顺序搜索;
2)每当搜索到一个节点,先判断path是否包括它,包括就说明已经经过此节点,不能
再经过了;如果不包括,就将其加入path容器;
3)直到搜索到str[length - 1]节点,说明成功找到,标记result为true,标记
isFinished为true,尽快结束所有的递归操作;
4)如果某节点起的 上、左、右、下 都搜索过但还没找到结果,说明经过此节点的路
径都不满足题意,将其从path中删除,回溯到上一层继续找。
两种写法如下,思路相同,可以选择自己容易理解的写法。

def __init__(self):
    self._dict = {}
def hasPath(self, matrix, rows, cols, path):
    # write code here
    # 将矩阵转成二维数组表示
    x = [list(matrix[i*cols:(i+1)*cols]) for i in range(rows)]
    for i in range(rows):
        for j in range(cols):
            self._dict = {}
            if self.dfs(x, i, j, path):
                return True
    return False
'''
def dfs(self, matrix, i, j, p):#四个if语句中i,j边界判断保证了不越界,return保证了去掉不匹配的结果
    if matrix[i][j] == p[0]:
        if not p[1:]:#出口,路径中所有字母都找到
            return True
        matrix[i][j] = ''#先置为空,递归后再改回来,保证了不发生重复
        if i > 0 and self.dfs(matrix, i-1, j, p[1:]):#向上寻找,回溯体现在递归中
            return True
        if i < len(matrix)-1 and self.dfs(matrix, i+1, j ,p[1:]):#向下寻找
            return True
        if j > 0 and self.dfs(matrix, i, j-1, p[1:]):#向左寻找
            return True
        if j < len(matrix[0])-1 and self.dfs(matrix, i, j+1, p[1:]):#向右寻找
            return True
        matrix[i][j] = p[0]
        return False
    else:
        return False
'''
def dfs(self, matrix, i, j, p):

    if not (0 <= i< len(matrix) and 0 <= j < len(matrix[0])):  # 越界
        return False
    if matrix[i][j] != p[0]:  # 不匹配
        return False
    if self._dict.get((i,j)) is not None:  # 重复路径
        return False
    self._dict[(i,j)] = 1
    if not p[1:]:
        return True
    # 向上下左右寻找
    return self.dfs(matrix,i+1,j,p[1:]) or self.dfs(matrix,i-1,j,p[1:]) or self.dfs(matrix,i,j+1,p[1:]) or self.dfs(matrix,i,j-1,p[1:])
全部评论
第二种写法有问题,因为每次匹配了一个字符都会将其对应位置置1,但是有可能它的上下左右不满足,该位置的字符以后可能会再次用到。 如: ['A', 'B', 'C', 'E', 'H', 'J', 'I', 'G'] ['S', 'F', 'C', 'S', 'L', 'O', 'P', 'Q'] ['A', 'D', 'E', 'E', 'M', 'N', 'O', 'E'] ['A', 'D', 'I', 'D', 'E', 'J', 'F', 'M'] ['V', 'C', 'E', 'I', 'F', 'G', 'G', 'S'] path= "SGGFIECVAASABCEHJIGQEM" 第二行第一列的S会被置1,但是真正的起始S应该是最后一行最后一列,第二行第一列的S会在路径的后面用到。
点赞 回复 分享
发布于 2019-09-08 10:44

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务