用C语言求最长公共子序列问题【超详细】【附源代码】

本文详细介绍了如何使用C语言解决最长公共子序列问题,通过动态规划的方法降低计算复杂度,附带源代码解释,帮助理解算法实现。
摘要由CSDN通过智能技术生成

【问题描述】给定两个字符序列,找到这俩个字符序列中最长的公共子序列
【输入形式】 1:A,B,C,B,D,A,B; 

                      2:B,D,F,A,B,A
【输出形式】B,D,A,B

【题目解析】这里所说的公共子序列,并不要求在俩个子序列中连续,就如例题中给出的输出形式我们可以发现,公共子序列在原序列2中并不是连续的,那这便要求我们考虑很多种情况,最容易想到的便是暴力求解,依次遍历序列1与2去比较。并对每次的结果进行比较,保留长度最大的公共子序列。这种思想容易想到,但空间时间复杂度较高,对资源开销巨大。通过分析我们容易发现,最长公共子序列为4时,一定存在公共子序列长度为3,2,1的子序列。例如:最长公共子序列为B,D,A,B;其长度为4,存在公共子序列:B,D,A;其长度为3,同理存在B,D;A;等子序列;可以看出最长子序列包含前一长度下的最优子结构,并且存在重叠子问题(即在前一长度序列下求出本次最佳 长度序列),那么我们便容易想到采取动态规划的思路解决此问题来降低开销。


【核心思路】

一、定义:为了方便处理问题,这里我们做如下定义:

                    1.定义X[i],Y[i]来存储俩个原始序列;

                    2.定义全局二维数组C[i][j]来记录遍历至X[i][j]处,目前最长公共子序列的长度;

               

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会C语言呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值