📅  最后修改于: 2023-12-03 14:50:48.451000             🧑  作者: Mango
这是国际空间研究组织(ISRO)2018年计算机科学考试的第73个问题。这个问题涉及字符串操作,需要编写一个程序,找到两个字符串中最长公共子序列的长度。
给定两个字符串$s_1$和$s_2$,请编写一个函数longest_common_subsequence(s1: str, s2: str) -> int
,计算$s_1$和$s_2$的最长公共子序列的长度。
输入:s1 = "AGGTAB", s2 = "GXTXAYB"
输出:4
解释:s1和s2的最长公共子序列为"GTAB",长度为4。
本题可以使用动态规划算法求解。我们可以使用一个二维数组dp
来表示$s_1$和$s_2$的最长公共子序列的长度。数组dp
的大小为$(m+1) × (n+1)$,其中$m$和$n$分别为字符串$s_1$和$s_2$的长度。
dp[i][j]
表示$s_1$的前$i$个字符和$s_2$的前$j$个字符的最长公共子序列的长度。当$i=0$或$j=0$时,dp[i][j]
为0。当$s_1[i]=s_2[j]$时,dp[i][j]
等于dp[i-1][j-1]+1
,否则dp[i][j]
等于$max(dp[i-1][j], dp[i][j-1])$。
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$分别为字符串$s_1$和$s_2$的长度。需要遍历一次二维数组dp
。
空间复杂度:$O(mn)$。需要使用一个二维数组dp
来保存中间状态。