📅  最后修改于: 2023-12-03 15:26:35.939000             🧑  作者: Mango
给定两个字符串s1和s2,找到s2中的最长子序列,使得它是s1的子字符串。
我们可以使用动态规划来解决这个问题。假设dp[i][j]表示以s1的第i个字符和s2的第j个字符之前的最长子序列的长度。如果s1[i] == s2[j],我们可以将s1的第i个字符和s2的第j个字符匹配,因此我们可以将dp[i][j]设为dp[i-1][j-1]+1,因为它们都在最长子序列中。否则,我们可以忽略s1的第i个字符,因此我们需要设置dp[i][j] = dp[i-1][j],或者忽略s2的第j个字符,因此我们需要设置dp[i][j] = dp[i][j-1]。最终,最长子序列的长度存储在dp[len(s1)][len(s2)]中。
以下是Python中的动态规划实现。
def longest_subsequence(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[m][n]
s1 = "abcde"
s2 = "ace"
print(longest_subsequence(s1, s2)) # 3
在上面的示例中,s2的最长子序列为"ace",它是s1的子字符串。