7-26 最长公共子序列
发布日期:2021-05-10 23:56:04 浏览次数:18 分类:精选文章

本文共 1293 字,大约阅读时间需要 4 分钟。

最长公共子序列(LCS)的问题可以通过动态规划来解决。以下是解决这个问题的详细步骤和代码实现。

方法思路

我们使用一个二维数组 dp[i][j] 来表示在字符串 a 的前 i 个字符和字符串 b 的前 j 个字符中最长公共子序列的长度。方法如下:

  • 初始化:当 ij 为0时,dp[i][j] 设为0,因为一个空字符串的子序列长度为0。
  • 比较字符:如果字符 a[i] 等于字符 b[j],则 dp[i][j] = dp[i-1][j-1] + 1,因为当前字符可以延续之前的最长公共子序列。
  • 递推关系:如果字符不相同,那么 dp[i][j] 取决于 dp[i-1][j]dp[i][j-1] 中的最大值。这个选择表示我们可以从前一个字符或者前面字符得到更长的公共子序列。
  • 通过填充整个二维数组,dp[m][n] 就会给出两个字符串的最长公共子序列的长度。


    代码实现

    #include 
    #include
    using namespace std;
    int main() {
    string a, b;
    cout << "请输入两个字符串:\n";
    cin >> a;
    cin >> b;
    int m = a.size();
    int n = b.size();
    int dp[m+1][n+1];
    // 初始化
    for(int i = 0; i <= m; ++i) {
    for(int j = 0; j <= n; ++j) {
    if(i == 0 || j == 0) {
    dp[i][j] = 0;
    } else {
    if(a[i-1] == b[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[m][n] << endl;
    return 0;
    }

    代码解释

  • 输入读取:使用 coutcin 读取两个字符串 ab
  • 动态规划数组dp初始化:大小为 (m+1) x (n+1),其中 mn 分别是字符串 ab 的长度。
  • 填充dp数组
    • 对于 i=0j=0dp[i][j] 设为0,因为无效情况。
    • 如果当前字符相等,dp[i][j] = dp[i-1][j-1] + 1
    • 如果当前字符不等,dp[i][j] 取决于前面两种可能的最长值。
  • 输出结果:打印 dp[m][n],即两个字符串的最长公共子序列的长度。
  • 上一篇:7-27 0/1背包
    下一篇:7-25 最长上升子序列

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月17日 16时58分04秒