题目:

若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列。例如序列"bcba"是序列"abcbdab"与"bdcaba"的公共子序列。
例如,给出序列X "hahafdreghsbacdba"和序列"acdbegshbdrabsa",如何求取这两个序列的最长公共子序列?

这道题具有典型的最优子结构特性,即它的最优解一定包含子问题的最优解,这么看使用动态规划来解决是比较合理的。动态规划解题步骤通常由三个部分构成

1. 分阶段。

2. 状态迁移方程。

3. 寻找最优解。

对于这道题,字符数组a存储序列X,数组b存储序列Y,设i, j分别为数组a, b的指针。m[i][j]表示序列a[0] ~ a[i]与序列b[0]~b[j]的最长公共子序列,当a[i] == b[i]时,俩字符相等,最长公共子序列等于m[i-1][j-1] + 1; 如果字符不等,则

m[i][j] = MAX(m[i-1][j], m[i][j-1]);这个就是状态迁移方程。得到了状态迁移方程,在开始递推之前,需要知道边界情况,这里的边界情况就是当i等于0时,对于任意的0 <= j <= len(b), m[i][j] = 0; 同理,当j = 0时,任意的0 <= i <= len(a), m[i][j] = 0。对于字符串而言,数组下标为0是有字符的,所以说这么算会带来处理上的不方便,既然顺序不方便那就是用倒序好了,假设m[i][j]表示序列a[i] ~ a[last]与序列a[j][last]的最长公共子序列长度,当i = len(a)的时候,任意的j值,m[i][j] = 0,这个也很好理解,i等于n,说明a里面没有字符,这时候对于任意的j值,m[i][j] = 0,同理对于j = len(b),此时任意的i值,m[i][j] = 0。通常使用动态规划解决问题的时候,都存在两种递推方式,顺序递推和逆序递推,具体使用哪种根据具体问题来决定。

得到状态迁移方程,就可以知道最优解了,即m[0][0];接下来就是打印最优解序列了,这个可以根据状态迁移方程来判断哪个字符在最优解序列中。

下面是该问题的c代码实现:

//最长公共子串的动态规划解法#include <stdio.h>
#include <string.h>#define MAX(a, b) ((a) > (b) ? (a) : (b))void main()
{int i, j, k, n, m[30][30] = {0};char astr[30+1] = "hsbafdreghsbacdba", bstr[30+1] = "acdbegshbdrabsa";n = strlen(astr);k = strlen(bstr);printf("string A : %s\n", astr);printf("string B : %s\n", bstr);//边界初始化for (i = 0; i < n; i++)m[i][k] = 0;for (j = 0; j < k; j++)m[n][j] = 0;//状态递推for (i = n - 1; i >= 0; i--){for (j = k - 1; j >= 0; j--){if (astr[i] == bstr[j])m[i][j] = m[i+1][j+1] + 1;elsem[i][j] = MAX (m[i+1][j], m[i][j+1]);}}//打印最优解printf("最长公共子串长度为:%d\n", m[0][0]); for (i = 0; i < n;){for (j = 0; j < k;){if (astr[i] == bstr[j]){printf("%c", astr[i]);i++;j++;}else{if (m[i][j] == m[i+1][j])i++;elsej++;}}}printf("\n");return;
}

参考资料:

1. 数据结构 : C语言版/ 严蔚敏,吴伟民编著

=============================================================================================

Linux应用程序、内核、驱动开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

动态规划 dp03 最长公共子串问题 c代码相关推荐

  1. 动态规划之最长公共子串

    一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...

  2. 总结几个字符串类的动态规划(最长公共子串,回文子串,子序列)

    在阅读下面的题目之前,首先需要确定的是,求子序列还是子串,子串需要是连续的,子序列无需连续,比如 "Hello",子串可以是 Hel, llo, lo 等,子序列可以是 Hlo, ...

  3. 动态规划:最长公共子串 最长公共子序列

    一.最长公共子串 1. 题目 给定两个序列 X 和 Y,如果 Z 即是 X 的子串,又是 Y 的子串,我们就称它是 X 和 Y 的公共子串,注意子串是连续的. 例如 X = { A, B, C, D, ...

  4. 牛客题目——最长公共子串、最长回文子串、兑换零钱

    文章目录 题目1--最长公共子串 解题思路 代码实现 题目2--最长回文子串 解题思路 代码实现 题目3--兑换零钱 解题思路 代码实现 题目1--最长公共子串 给定两个字符串str1和str2,输出 ...

  5. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  6. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  7. 动态规划--最长公共子串

    找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.其实这又是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?"bab&quo ...

  8. 动态规划—最长公共子串

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

  9. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

最新文章

  1. nginx学习之静态内容篇(五)
  2. 初中数学老师计算机培训反思,初中数学教师培训心得体会
  3. JFreeChart插件
  4. 10G_Ethernet_04 10G Ethernet Subsystem IP 的快速验证(万兆以太网IP的快速验证)
  5. 图神经网络(二)GCN的性质(3)GCN是一个低通滤波器
  6. jQuery表单校验
  7. 因特网几个“特殊”IP地址的专门用途
  8. sqlite 可视化_知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案
  9. SAAS多租户实现方案_springboot 实现多租户_基于共享数据库_共享schema_共享数据表_基于baomidou_mybatis_plus---springcloud工作笔记158
  10. VC++6.0安装步骤
  11. int输出%f浮点值是0,double/float 浮点数%d输出0的原因
  12. 疫情之下, 远程办公软件是如何逆势增长的?
  13. 关于被隐藏的文件夹无法去掉隐藏的属性
  14. svchost.exe小记
  15. ACM-ICPC 2018 焦作赛区网络预赛 L Poor God Water(BM算法)
  16. DOS中使用扩展内存与XMS操作库设计
  17. 用EXCEL做九九乘法表
  18. 信息流广告的核心是什么(信息流推广的核心操作和优化思路)
  19. 写在前面-数据结构与算法分析
  20. chrom,firefox,ie不能上网,百度浏览器却可以。。。

热门文章

  1. QEMU KVM Libvirt手册(7): 硬件虚拟化
  2. 浅谈工作流引擎的几个关键因素
  3. source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历
  4. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第8章-固定翼飞行器的编队跟踪与姿态调节一体化控制
  5. 4.9 总结-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  6. IC-工具篇--VCS使用教程-卷二(202004013)
  7. STM32系列--初识寄存器1
  8. 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块
  9. 【S操作】一个简单粗暴易用的远程调试方案——OTA http update
  10. openssl 证书管理