📅  最后修改于: 2023-12-03 15:10:37.441000             🧑  作者: Mango
最长公共子序列(LCS)是指在两个序列中都出现的最长子序列,而不要求子序列在原序列中的位置是连续的。LCS问题被广泛应用于文本比较、语音识别、基因序列分析等领域。
下面是一个简单的Python实现,使用动态规划算法解决最长公共子序列问题。
用dp[i][j]
表示text1[:i]
和text2[:j]
的最长公共子序列的长度。则有:
text1[i-1] == text2[j-1]
,则dp[i][j] = dp[i-1][j-1] + 1
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
其中,text1[:i]
表示text1
中第0个字符到第i个字符组成的子串,text2[:j]
同理。
def longest_common_subsequence(text1: str, text2: str) -> int:
m, n = len(text1), len(text2)
# 初始化 dp
dp = [[0] * (n+1) for _ in range(m+1)]
# 计算最长公共子序列长度
for i in range(1, m+1):
for j in range(1, n+1):
if text1[i-1] == text2[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]
我们来测试一下上面的代码是否正确:
text1 = "abcde"
text2 = "ace"
print(longest_common_subsequence(text1, text2)) # 3
结果应该是3
,对吧!
算法的时间复杂度是O(mn),其中m和n分别是text1和text2的长度。因此,当序列很长时,算法可能会比较慢。不过,由于算法使用了动态规划的思想,一般情况下都能够在合理的时间内得出答案。