📅  最后修改于: 2023-12-03 15:26:28.329000             🧑  作者: Mango
最长公共子序列(Longest Common Subsequence,缩写为 LCS)是指在两个或多个序列中,以相同顺序出现,但不要求连续的子序列,且要求子序列在各序列中的位置顺序相同的情况下,所包含元素最多。
求解最长公共子序列问题最常用的算法是动态规划。
假设给定两个字符串 S1 和 S2,分别求出它们的最长公共子序列。首先,定义一个二维的 DP 数组 dp。其中,dp[i][j] 表示 S1[0…i] 和 S2[0…j] 的最长公共子序列长度。
最长公共子序列的长度即为 dp[len(S1)-1][len(S2)-1]。
def lcs(s1: str, s2: str) -> int:
len1, len2 = len(s1), len(s2)
dp = [[0] * (len2 + 1) for _ in range(len1 + 1)]
for i in range(1, len1 + 1):
for j in range(1, len2 + 1):
if s1[i - 1] == s2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
return dp[-1][-1]
s1 = "ABCD"
s2 = "ACDF"
print(lcs(s1, s2)) # 3
上面的示例中,S1 和 S2 的最长公共子序列为 ACD。