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

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

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

最长公共子序列(Longest Common Subsequence)是指两个或多个字符串序列中最长的子序列,这个子序列不需要在原字符串中连续出现。求解最长公共子序列可以采用动态规划算法,时间复杂度为O(N^2)。

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

#include <iostream>
#include <cstring>

using namespace std;

const int MAXN = 1005;

int dp[MAXN][MAXN];

int main() {
    string str1, str2;
    getline(cin, str1);   // 读入字符串1
    getline(cin, str2);   // 读入字符串2

    int len1 = str1.length();
    int len2 = str2.length();

    memset(dp, 0, sizeof(dp)); // 初始化dp数组

    // 边界初始化
    for (int i = 0; i <= len1; i++) {
        dp[i][0] = 0;
    }
    for (int i = 0; i <= len2; i++) {
        dp[0][i] = 0;
    }

    // 动态规划
    for (int i = 1; i <= len1; i++) {
        for (int j = 1; j <= len2; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }

    // 输出结果
    cout << "最长公共子序列长度为:" << dp[len1][len2] << endl;

    return 0;
}
算法原理

最长公共子序列的求解可以采用动态规划算法,定义dp[i][j]为序列str1(0~i)和序列str2(0~j)的最长公共子序列长度,那么dp[i][j]有以下两种情况:

  1. str1[i] == str2[j],此时dp[i][j] = dp[i-1][j-1] + 1。

  2. str1[i] != str2[j],此时dp[i][j] = max(dp[i-1][j], dp[i][j-1])。

最后,dp[len1][len2]即表示序列str1和序列str2的最长公共子序列长度。

代码解释
  1. 由于输入的是带空格的字符串,所以采用getline()函数读入。

  2. 初始化dp数组为0。

  3. 边界条件初始化:dp[i][0]和dp[0][j]都为0,表示一个字符串为空时,最长公共子序列长度为0。

  4. 动态规划:当字符串str1[i-1]等于字符串str2[j-1]时,dp[i][j] = dp[i-1][j-1]+1,否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。

  5. 输出最长公共子序列长度。

参考资料
  1. 最长公共子序列

  2. 最长公共子序列(动态规划+代码)