最长公共子字符串(动态规划)
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}
完整的代码如下:
- /**
- 找出两个字符串的最长公共连续子串的长度
- ** author :liuzhiwei
- ** data :2011-08-16
- **/
- #include "stdio.h"
- #include "string.h"
- #include "stdlib.h"
- int longest_common_substring(char *str1, char *str2)
- {
- int i,j,k,len1,len2,max,x,y;
- len1 = strlen(str1);
- len2 = strlen(str2);
- int **c = new int*[len1+1];
- for(i = 0; i < len1+1; i++)
- c[i] = new int[len2+1];
- for(i = 0; i < len1+1; i++)
- c[i][0]=0; //第0列都初始化为0
- for(j = 0; j < len2+1; j++)
- c[0][j]=0; //第0行都初始化为0
- max = -1;
- for(i = 1 ; i < len1+1 ; i++)
- {
- for(j = 1; j < len2+1; j++)
- {
- if(str1[i]==str2[j]) //只需要跟左上方的c[i-1][j-1]比较就可以了
- c[i][j]=c[i-1][j-1]+1;
- else
- c[i][j]=0;
- if(c[i][j]>max)
- {
- max=c[i][j];
- x=i;
- y=j;
- }
- }
- }
- //输出公共子串
- char s[1000];
- k=max;
- i=x-1,j=y-1;
- s[k--]='\0';
- while(i>=0 && j>=0)
- {
- if(str1[i]==str2[j])
- {
- s[k--]=str1[i];
- i--;
- j--;
- }
- else //只要有一个不相等,就说明相等的公共字符断了,不连续了
- break;
- }
- printf("最长公共子串为:");
- puts(s);
- for(i = 0; i < len1+1; i++) //释放动态申请的二维数组
- delete[] c[i];
- delete[] c;
- return max;
- }
- int main(void)
- {
- char str1[1000],str2[1000];
- printf("请输入第一个字符串:");
- gets(str1);
- printf("请输入第二个字符串:");
- gets(str2);
- int len = longest_common_substring(str1, str2);
- printf("最长公共连续子串的长度为:%d\n",len);
- system("pause");
- return 0;
- }
最长公共子字符串(动态规划)相关推荐
- 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划
最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...
- 程序员面试100题之七:最长公共子字符串
子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中.比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2. 最长公共子字符串共有两种解决方法,下面 ...
- 程序员面试100题之七 最长公共子字符串
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 子字符串 ...
- 两个字符串的最长公共子序列长度_求2个字符串的最长公共子序列和最长公共子字符串...
一. 最长公共子序列 定义: 一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 例如:输入两个字符串BDCABA和 ABCBDA ...
- 动态规划算法分析和理解:最长公共子序列、公共子字符串
定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...
- 【算法】【递归与动态规划模块】两个字符串的最长公共子数组
目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 蓝桥杯 ADV-202算法提高 最长公共子序列(动态规划)
问题描述 给定两个字符串,寻找这两个字串之间的最长公共子序列. 输入格式 输入两行,分别包含一个字符串,仅含有小写字母. 输出格式 最长公共子序列的长度. 样例输入 abcdgh aedfhb 样例输 ...
- 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和"baabcdadabc", 可以找到的最长的公共子串 ...
最新文章
- Windows文件系统过滤驱动开发教程(0,1,2)
- iOS: 在代码中使用Autolayout (1) - 按比例缩放和优先级
- java虚拟机监控_Java虚拟机监控工具
- Oracle版本号的含义
- PHP 过滤器(Filter)
- Java学习之斐波那契数列实现
- 如何在js中使用ajax请求数据,在 JS 中怎么使用 Ajax 来进行请求
- (转)基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理...
- Java dom4j解析RESTFull风格发布的WebService的xml文件
- 手把手教你写一个java的orm(二)
- sql格式化工具-SQL Pretty Printer
- 《鸟哥Linux私房菜》系列
- ftp服务器和文件夹共享文件夹,ftp服务器和文件夹共享文件夹
- WinRAR是什么?------压缩工具
- 李飞飞:云原生数据库是大势所趋
- 据消息称小米显示器34寸带鱼屏即将暂停销售:因为三星屏幕停止供应。
- RoboMaster汇总
- 微软2009年10月MVP(最有价值专家)博客园选区候选人名单
- wpa_supplicant 介绍
- ch19.PDO。p360---练习三。通过pdo更新数据