📜  最长公共子序列的 C++ 程序(1)

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

最长公共子序列的 C++ 程序介绍

概述

在算法与数据结构中,最长公共子序列(Longest Common Subsequence,LCS)是两个序列(可以是字符串、链表、数组等)的最长子序列,而不要求这些字符在原序列中是连续的。最长公共子序列问题是在多项式时间内求解的一个经典问题,也是许多算法的基础。

算法实现

下面是最长公共子序列的 C++ 程序实现:

#include<iostream>
#include<cstring>

using namespace std;

int LCS(string s1,string s2){
    int len1 = s1.length(),len2 = s2.length();
    int dp[len1+1][len2+1];// dp数组
    memset(dp, 0, sizeof(dp));// 初始化为0
    for (int i = 1; i <= len1; ++i) {
        for (int j = 1; j <= len2; ++j) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;// 相同的字符
            } 
            else {
                dp[i][j] = max(dp[i][j-1], dp[i-1][j]);// 不同的字符
            }
        }
    }
    return dp[len1][len2];// 返回最长公共子序列长度
}

int main(){
    string s1 = "ABCD", s2 = "ACDF";
    cout<<LCS(s1, s2)<<endl;// 输出最长公共子序列的长度
    return 0;
}
算法分析

最长公共子序列问题通常采用动态规划来求解,其时间复杂度为 O(mn)。其中,m 和 n 分别表示两个序列的长度。

在上面的程序实现中,我们用 dp[i][j] 表示 s1 中前 i 个字符和 s2 中前 j 个字符的最长公共子序列长度。根据最长公共子序列的定义,当 s1[i-1] == s2[j-1] 时,dp[i][j] 应该等于 dp[i-1][j-1] + 1;否则,dp[i][j] 应该等于 max(dp[i][j-1], dp[i-1][j])。

在上述过程中,我们需要注意初始化 dp 数组,初始化 dp 数组的行、列都需要多加一个元素,即 dp[len1+1][len2+1]。这是因为当 i 或 j 为 0 时,dp[i][j] 的值为 0。

总结

本文介绍了最长公共子序列问题的 C++ 程序实现,通过动态规划求解其长度。实际应用中,可以在计算最长公共子序列的同时,记录下了公共子序列中的字符,从而得到最长公共子序列的具体内容。