📌  相关文章
📜  国际空间研究组织 | ISRO CS 2018 |问题 73(1)

📅  最后修改于: 2023-12-03 14:50:48.451000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2018 |问题 73

这是国际空间研究组织(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来保存中间状态。