Python程序:查找子序列中最大回文长度


假设我们有两个字符串s和t。我们想按照以下方式创建一个字符串:

  • 从s中选择一些非空子序列sub1。

  • 从t中选择一些非空子序列sub2。

  • 连接sub1和sub2,形成一个字符串。

我们需要找到可以用这种方式形成的最长回文长度。如果无法形成任何回文,则返回0。

例如,如果输入是s = "hillrace",t = "cargame",则输出为7,因为我们可以从s中取"race",从t中取"car",所以"racecar"是一个长度为7的回文。

为了解决这个问题,我们将遵循以下步骤:

  • n := s的长度,m := t的长度

  • word := s + t

  • dp := 创建一个大小为(n+m) x (n+m)的二维数组,并用0填充

  • 对于i从(n + m - 1)到0递减,执行:

    • 对于j从i到(n + m - 1),执行:

      • 如果i等于j,则

        • dp[i, j] := 1

      • 否则,如果word[i]等于word[j],则

        • dp[i, j] := 2 + dp[i + 1, j - 1]

      • 否则,

        • dp[i, j] = dp[i + 1, j]和dp[i, j - 1]的最大值

  • ans := 0

  • 对于i从0到n-1,执行:

    • 对于j从m-1到-1递减,执行:

      • 如果s[i]等于t[j],则

        • ans = ans和dp[i, n + j]的最大值

  • 返回ans

示例

让我们看下面的实现来更好地理解

def solve(s, t):
   n, m = len(s), len(t)
   word = s + t
   dp = [[0] * (n + m) for _ in range(n + m)]

   for i in range(n + m - 1, -1,-1):
      for j in range(i, n + m):
         if i == j:
            dp[i][j] = 1
         elif word[i] == word[j]:
            dp[i][j] = 2 + dp[i + 1][j - 1]
         else:
            dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
   ans = 0
   for i in range(n):
      for j in range(m - 1, -1, -1):
         if s[i] == t[j]:
            ans = max(ans, dp[i][n + j])
   return ans

s = "hillrace"
t = "cargame"
print(solve(s, t))

输入

[[2,2],[1,2],[3,2]], [[3,1],[3,3],[5,2]]

输出

7

更新于:2021年10月8日

浏览量:128

启动你的职业生涯

完成课程获得认证

开始学习
广告