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
广告