X = <a, b, c, f, b, c>

Y = <a, b, f, c, a, b>

X和Y的Longest Common Substring为 <a, b>长度为2

动态规划解法

c[i][j]表示X0...Xi和Y0...Yj的最大SubstringXi=Yj)的长度,比如

X = <y, e, d, f>

Y = <y, e, k, f>

c[1][1] = 1

c[2][2] = 2

c[3][3] = 0

c[4][4] = 1

 动态转移方程为:

   如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1

   如果xi ! = yj,  那么c[i][j] = 0

最后求Longest Common Substring的长度等于

max{  c[i][j],  1<=i<=n, 1<=j<=m}

完整的代码如下:

view plain
  1. /**
  2. 找出两个字符串的最长公共连续子串的长度
  3. ** author :liuzhiwei
  4. ** data   :2011-08-16
  5. **/
  6. #include "stdio.h"
  7. #include "string.h"
  8. #include "stdlib.h"
  9. int longest_common_substring(char *str1, char *str2)
  10. {
  11. int i,j,k,len1,len2,max,x,y;
  12. len1 = strlen(str1);
  13. len2 = strlen(str2);
  14. int **c = new int*[len1+1];
  15. for(i = 0; i < len1+1; i++)
  16. c[i] = new int[len2+1];
  17. for(i = 0; i < len1+1; i++)
  18. c[i][0]=0;        //第0列都初始化为0
  19. for(j = 0; j < len2+1; j++)
  20. c[0][j]=0;        //第0行都初始化为0
  21. max = -1;
  22. for(i = 1 ; i < len1+1 ; i++)
  23. {
  24. for(j = 1; j < len2+1; j++)
  25. {
  26. if(str1[i]==str2[j])     //只需要跟左上方的c[i-1][j-1]比较就可以了
  27. c[i][j]=c[i-1][j-1]+1;
  28. else
  29. c[i][j]=0;
  30. if(c[i][j]>max)
  31. {
  32. max=c[i][j];
  33. x=i;
  34. y=j;
  35. }
  36. }
  37. }
  38. //输出公共子串
  39. char s[1000];
  40. k=max;
  41. i=x-1,j=y-1;
  42. s[k--]='\0';
  43. while(i>=0 && j>=0)
  44. {
  45. if(str1[i]==str2[j])
  46. {
  47. s[k--]=str1[i];
  48. i--;
  49. j--;
  50. }
  51. else       //只要有一个不相等,就说明相等的公共字符断了,不连续了
  52. break;
  53. }
  54. printf("最长公共子串为:");
  55. puts(s);
  56. for(i = 0; i < len1+1; i++)         //释放动态申请的二维数组
  57. delete[] c[i];
  58. delete[] c;
  59. return max;
  60. }
  61. int main(void)
  62. {
  63. char str1[1000],str2[1000];
  64. printf("请输入第一个字符串:");
  65. gets(str1);
  66. printf("请输入第二个字符串:");
  67. gets(str2);
  68. int len = longest_common_substring(str1, str2);
  69. printf("最长公共连续子串的长度为:%d\n",len);
  70. system("pause");
  71. return 0;
  72. }

最长公共子字符串(动态规划)相关推荐

  1. 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划

    最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...

  2. 程序员面试100题之七:最长公共子字符串

    子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中.比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2. 最长公共子字符串共有两种解决方法,下面 ...

  3. 程序员面试100题之七 最长公共子字符串

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 子字符串 ...

  4. 两个字符串的最长公共子序列长度_求2个字符串的最长公共子序列和最长公共子字符串...

    一. 最长公共子序列 定义: 一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 例如:输入两个字符串BDCABA和 ABCBDA ...

  5. 动态规划算法分析和理解:最长公共子序列、公共子字符串

    定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...

  6. 【算法】【递归与动态规划模块】两个字符串的最长公共子数组

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  7. 算法知识之最长公共子序列问题(动态规划)

    最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...

  8. 蓝桥杯 ADV-202算法提高 最长公共子序列(动态规划)

    问题描述 给定两个字符串,寻找这两个字串之间的最长公共子序列. 输入格式 输入两行,分别包含一个字符串,仅含有小写字母. 输出格式 最长公共子序列的长度. 样例输入 abcdgh aedfhb 样例输 ...

  9. 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))

    最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和"baabcdadabc", 可以找到的最长的公共子串 ...

最新文章

  1. Windows文件系统过滤驱动开发教程(0,1,2)
  2. iOS: 在代码中使用Autolayout (1) - 按比例缩放和优先级
  3. java虚拟机监控_Java虚拟机监控工具
  4. Oracle版本号的含义
  5. PHP 过滤器(Filter)
  6. Java学习之斐波那契数列实现
  7. 如何在js中使用ajax请求数据,在 JS 中怎么使用 Ajax 来进行请求
  8. (转)基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理...
  9. Java dom4j解析RESTFull风格发布的WebService的xml文件
  10. 手把手教你写一个java的orm(二)
  11. sql格式化工具-SQL Pretty Printer
  12. 《鸟哥Linux私房菜》系列
  13. ftp服务器和文件夹共享文件夹,ftp服务器和文件夹共享文件夹
  14. WinRAR是什么?------压缩工具
  15. 李飞飞:云原生数据库是大势所趋
  16. 据消息称小米显示器34寸带鱼屏即将暂停销售:因为三星屏幕停止供应。
  17. RoboMaster汇总
  18. 微软2009年10月MVP(最有价值专家)博客园选区候选人名单
  19. wpa_supplicant 介绍
  20. ch19.PDO。p360---练习三。通过pdo更新数据

热门文章

  1. slice 和 splice 区别
  2. superslide 学习笔记
  3. Castle.MircoKernel Class Diagram - Part I
  4. Mybatis之占位符与拼接符
  5. js实现浏览器后退页面刷新
  6. 【计算机网络】详解HttpURLConnection
  7. poj1769 线段树优化的dp
  8. android学习日记16--GridView(网格视图)
  9. android中AndroidManifest.xml 的解析 (转)
  10. Android系统介绍