📌  相关文章
📜  打印矩阵中从左上角到右下角的所有回文路径(1)

📅  最后修改于: 2023-12-03 14:54:29.628000             🧑  作者: Mango

打印矩阵中从左上角到右下角的所有回文路径

在一个矩阵中,从左上角到右下角有很多路径。此外,对于一个路径而言,如果其反转后与自身相同,则被称为回文路径。现在需要打印出所有从左上角到右下角的回文路径。

解决方案

算法思路

回文路径可以从喜欢的两个方向进行拼接,因此我们可以通过遍历所有路径,并在其前后同时进行拼接,看其是否回文。如果是回文,则将其打印出来。

具体的算法思路如下:

1.定义一个辅助函数,用于判断某个字符串是否为回文。

2.遍历所有从左上角到右下角的路径,并在其两端同时进行拼接。

3.对于拼接后的路径,判断其是否为回文,如果是,则将其打印出来。

代码实现

def printPalindromePaths(matrix):
    if not matrix:
        return

    # 辅助函数,判断一个字符串是否为回文
    def isPalindrome(s):
        if len(s) < 2:
            return True
        if s[0] != s[-1]:
            return False
        return isPalindrome(s[1:-1])

    m, n = len(matrix), len(matrix[0])
    paths = []
    for i in range(m):
        for j in range(n):
            path = []
            findPaths(i, j, m, n, matrix, path, paths)

    for path in paths:
        # 判断拼接后的路径是否为回文
        s = ''.join(path + path[-2::-1])
        if isPalindrome(s):
            print(''.join(path))

# 递归函数,遍历所有的路径并进行拼接
def findPaths(i, j, m, n, matrix, path, paths):
    # 越界或者已经访问过的点直接返回
    if i < 0 or i >= m or j < 0 or j >= n or matrix[i][j] is None:
        return

    # 放入当前点
    path.append(matrix[i][j])
    # 到达终点,将路径添加到结果中
    if i == m-1 and j == n-1:
        paths.append(path.copy())
    # 继续向下遍历
    else:
        matrix[i][j] = None
        findPaths(i+1, j, m, n, matrix, path, paths)
        # 继续向右遍历
        findPaths(i, j+1, m, n, matrix, path, paths)
        # 继续向上遍历
        findPaths(i-1, j, m, n, matrix, path, paths)
        # 继续向左遍历
        findPaths(i, j-1, m, n, matrix, path, paths)

    # 回溯
    matrix[i][j] = path.pop()

# 测试代码
matrix = [[1,2,3],[4,5,6],[7,8,9]]
printPalindromePaths(matrix)

时间复杂度

在遍历所有路径时,每个点会被访问一次,因此时间复杂度为 $O(n^2)$,其中 $n$ 表示矩阵的边长。

在拼接路径时,每个路径的长度为 $O(n)$,因此总时间复杂度为 $O(n^3)$。

空间复杂度

由于需要记录每条路径,因此空间复杂度为 $O(n^3)$。