【问题标题】:Longest consecutive path in a matrix of letters字母矩阵中最长的连续路径
【发布时间】:2018-12-19 21:39:30
【问题描述】:

我正在尝试解决这个问题:

给定一个 n * m 的矩阵,包含字母(字符),找到矩阵中字母的最长连续路径并输出字符串。例如:

m = [[a,c,d],[i,b,e],[h,g,f]]

result = e,f,g,h

您只能在矩阵内上下左右移动。到目前为止,这是我在网上了解一些信息后得出的结论,但我并不是一路走来。 我还想让解决方案高效,我当前的代码可能有太多循环,并且对于大型矩阵可能很慢。任何帮助将不胜感激!

R = len(matrix)
C = len(matrix[0])

x = [0, 1, 0, -1]
y = [1, 0, -1, 0]

dp=[[0 for i in range(C)]for i in range(R)]

def isvalid( i, j):
    if (i < 0 or j < 0 or i >= R or j >= C):
        return False
    return True

def getLenUtil(matrix, i, j, prev):
    if (isvalid(i, j)==False or isadjacent(prev, mat[i][j])==False):
        return 0
    if (dp[i][j] != -1):
        return dp[i][j]

    ans = 0

    for k in range(4):
        ans = max(ans, 1 + getLenUtil(mat, i + x[k],j + y[k], mat[i][j]))

    dp[i][j] = ans
    return dp[i][j]

def isadjacent(prev, curr):
    if (ord(curr) -ord(prev)) == 1:
        return True
    return False

def findLongestSequence(matrix):
    for i in range(R):
        for j in range(C):
            dp[i][j]=-1
    ans = 0
    for i in range(R):
        for j in range(C):
            if (mat[i][j] == s):
                for k in range(4):
                    ans = max(ans, 1 + getLenUtil(matrix, i + x[k], j + y[k], s));
     return ans

【问题讨论】:

  • 你在哪里定义了s? mat 和 matrix 之间似乎也存在不匹配。你调试过这段代码吗?
  • 当有从“b”到“i”的路径时,为什么示例 4 的答案是?为什么不是8?

标签: arrays python-3.x matrix data-structures


【解决方案1】:

您的代码中有几个问题:

  • mat和matrix拼写要统一。
  • s 从未初始化
  • 在R = len(matrix) 和其他几个对mat 或matrix 的引用中,未定义该变量。 findLongestSequence 是用matrix 的实际值调用的,所以它在那里应该定义R,...等等

还有,

  • 如果您不传递prev 而是传递实际的预期 字符(即已经“递增”),则更容易。
  • 为什么先用零初始化dp,然后再用-1 重新初始化?立即使用 -1。

这是它的工作原理:

def findLongestSequence(mat):
    R = len(mat)
    C = len(mat[0])

    x = [0, 1, 0, -1]
    y = [1, 0, -1, 0]

    dp = [[-1 for i in range(C)] for i in range(R)]

    def isvalid( i, j):
        return (0 <= i < R) and (0 <= j < C)

    def getLenUtil(mat, i, j, expected):
        if not isvalid(i, j) or mat[i][j] != expected:
            return 0

        if dp[i][j] == -1:
            ans = 0
            expected = chr(ord(mat[i][j])+1)
            for k in range(4):
                ans = max(ans, 1 + getLenUtil(mat, i + x[k], j + y[k], expected))

            dp[i][j] = ans
        return dp[i][j]

    ans = 0
    for i in range(R):
        for j in range(C):
            getLenUtil(mat, i, j, mat[i][j])
        ans = max(ans, max(dp[i]))
    print(dp)
    return ans

res = findLongestSequence([["a","c","d"],["i","b","e"],["h","g","f"]])
print(res)

请注意,对于此示例数据,返回的答案是 8,而不是 4,因为最长的序列以“b”开头并以“i”结尾——总共 8 个字符。

【讨论】:

  • 非常感谢,是的,我在语法上犯了一些错误,而且不一致。这是一种更简单的方法。如果我想输出字符本身而不是显示连续字符的长度,你会建议我做什么?
  • 你会返回一个列表。所以return 0变成return [],ans = 0变成ans = []。 ans = max(....) 变得更加复杂,您可以将len(ans) 与递归返回的长度进行比较。如果后者相等或更长,则让ans 为返回的列表加上当前字母,否则不要碰它。
  • 试一试。如果您遇到问题,请提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2020-03-06
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多