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

📅  最后修改于: 2023-12-03 15:37:14.012000             🧑  作者: Mango

ISRO CS 2008 | 问题 61

该题目是印度空间研究组织(ISRO) 2008年计算机科学考试的一道问题。

问题描述

给定两个字符串,计算它们的最长公共子序列长度。

例如,对于字符串“XMJYAUZ”和“MZJAWXU”,它们的最长公共子序列为“MJAU”,其长度为4。

解题思路

这是一个经典的动态规划问题,可通过以下步骤来求解:

  1. 初始化一个 $m$ 行 $n$ 列的矩阵 $L$,其中 $m$ 和 $n$ 分别是两个字符串的长度。

  2. 遍历矩阵,对于每一个 $L_{i,j}$,如果 $i=0$ 或 $j=0$,则将其赋值为0,否则:

    • 如果字符 $i$ 和字符 $j$ 相等,则 $L_{i,j}=L_{i-1,j-1}+1$;

    • 如果字符 $i$ 和字符 $j$ 不相等,则 $L_{i,j}=\max(L_{i,j-1},L_{i-1,j})$。

  3. 最后,矩阵右下角的元素即为两个字符串的最长公共子序列长度。

  4. 可以根据矩阵还原出最长公共子序列。

代码实现

下面是 Python 代码的实现:

def longest_common_subsequence(s1, s2):
    m, n = len(s1), len(s2)
    L = [[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]:
                L[i][j] = L[i-1][j-1] + 1
            else:
                L[i][j] = max(L[i-1][j], L[i][j-1])

    lcs = ""
    i, j = m, n
    while i > 0 and j > 0:
        if s1[i-1] == s2[j-1]:
            lcs = s1[i-1] + lcs
            i -= 1
            j -= 1
        elif L[i-1][j] > L[i][j-1]:
            i -= 1
        else:
            j -= 1

    return L[m][n], lcs

其中,函数 longest_common_subsequence(s1, s2) 中,s1s2 分别是两个字符串,它返回这两个字符串的最长公共子序列的长度和具体内容。