📅  最后修改于: 2023-12-03 14:58:20.870000             🧑  作者: Mango
本题是一道针对程序员的算法题,涉及到最长公共子序列的问题。
给定两个字符串S1和S2,求S1和S2的最长公共子序列的长度。
输入:
S1 = "ABCBDAB"
S2 = "BDCABA"
输出:
4 (最长公共子序列为"BCBA")
此题采用动态规划算法进行求解。设LCS(i, j)表示字符串S1的前i个字符和字符串S2的前j个字符的最长公共子序列的长度,则有以下递推公式:
最终答案为LCS(m, n),其中m和n分别为S1和S2的长度。
下面是Python实现代码片段:
def longest_common_subsequence(s1: str, s2: str) -> int:
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]
时间复杂度为O(mn),其中m和n分别为S1和S2的长度。