数据结构与算法之最长公共子序列

本文详细介绍了如何使用C、C++和Java三种编程语言实现最长公共子序列(LCS)算法,包括动态规划的原理、状态转移方程和代码示例,以及回溯过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长公共子序列(LCS)是指给定两个序列X和Y,找出一个最长的子序列既是X的子序列也是Y的子序列。子序列是指在序列中删去任意个元素而不改变其他元素顺序得到的新序列。

LCS问题可以使用动态规划求解。假设x[1…m]和y[1…n]是两个序列,令c[i,j]表示x[1…i]和y[1…j]的LCS长度,则有以下状态转移方程:

  • 当i=0或j=0时,c[i,j]=0;
  • 当x[i]=y[j]时,c[i,j]=c[i-1,j-1]+1;
  • 当x[i]!=y[j]时,c[i,j]=max(c[i,j-1],c[i-1,j])。

根据上述方程,可以使用一个二维数组c来存储每个子问题的解,从而只需要计算一次就可以在O(mn)的时间复杂度内求出LCS的长度。

求出LCS的长度之后,可以通过回溯求出具体的LCS序列。从c[m,n]开始,不断向左上方移动,如果x[i]=y[j],则将x[i]加入LCS序列中,直到回溯到c[0,0]为止。

在这里插入图片描述

一、C 实现 最长公共子序列 及代码详解

下面是 C 语言实现最长公共子序列的代码:

#include <stdio.h>
#include <string.h>

#define MAX_LEN 100

int max(int a, int b) {
   
    return a > b ? a : b;
}

void lcs(char *s1, char *s2, int m, int n) {
   
    int dp[MAX_LEN][MAX_LEN];
    int i, j, k;

    memset(dp, 0, sizeof(dp));

    for (i = 1; i <= m; i++) {
   
        for (j = 1; j <= n; 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]);
            }
        }
    }

    printf("Length of LCS: %d\n", dp[m][n]);

    char lcs[MAX_LEN];
    k = dp[m][n];
    i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值