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

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

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

最长公共子序列(Longest Common Subsequence, LCS)是一类常见的字符串匹配问题,指的是找出两个或多个字符串中最长的公共子序列。

在C++中,我们可以使用动态规划来求解最长公共子序列。下面是一个C++程序,演示了如何使用动态规划求解最长公共子序列。

代码实现
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

// 求解最长公共子序列
int lcs(string s1, string s2)
{
    int len1 = s1.length();
    int len2 = s2.length();

    int dp[len1+1][len2+1];

    // 初始化动态规划表
    for(int i=0; i<=len1; i++)
    {
        for(int j=0; j<=len2; j++)
        {
            dp[i][j] = 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-1][j], dp[i][j-1]);
            }
        }
    }

    // 返回最长公共子序列的长度
    return dp[len1][len2];
}

int main()
{
    string s1 = "abcd";
    string s2 = "bcda";

    cout<<"最长公共子序列的长度为: "<<lcs(s1,s2);

    return 0;
}
解释

本程序中,lcs函数用于求解两个字符串str1str2的最长公共子序列的长度。其中,动态规划表dp用于存储以s1[i-1]s2[j-1]为结尾的最长公共子序列的长度。

动态规划表dp的初始化为dp[i][j]=0,其中0<=i<=len10<=j<=len2。当s1[i-1] == s2[j-1]时,说明此时s1[i-1]s2[j-1]属于最长公共子序列的一部分,因此可以通过s1[0:i-1]s2[0:j-1]推导出s1[0:i]s2[0:j]的最长公共子序列,即dp[i][j] = dp[i-1][j-1] + 1;当s1[i-1] != s2[j-1]时,说明此时s1[i-1]s2[j-1]不属于最长公共子序列的一部分,因此需要选取s1[0:i-1]s2[0:j]以及s1[0:i]s2[0:j-1]两者的最长公共子序列中的最大值,即dp[i][j] = max(dp[i-1][j], dp[i][j-1])

最终,函数返回动态规划表dp的最后一个元素dp[len1][len2],即为最长公共子序列的长度。

在程序中,我们以字符串"abcd""bcda"为例,通过调用lcs函数计算出了它们之间的最长公共子序列长度为3,即为字符串"bcd"

总结

最长公共子序列是一个经典的求解字符串匹配问题,它的动态规划解法可以有效地解决此类问题。本文中,我们通过C++代码实现了最长公共子序列的求解过程,对于C++中使用动态规划求解问题的程序员来说,这无疑是一份十分有用的参考资料。