求最长连续公共子串
来源:互联网 发布:演艺行业的二手数据库 编辑:程序博客网 时间:2024/05/17 02:11
说到求最长公共子串首先想到的是逐个子串比较,但是那样的话算法的复杂度太高,后来就想到用矩阵的方法去解决 思路如下:
比如字符创a:abcdefg 和字符串b:bdeabc 创建矩阵如下图所示
发现如果连续的斜线值为1的长度最长的话 则为最长公共子串 则abc为最长公共子串 ,
那我们可把矩阵进化为:
我们在计算矩阵的过程中判断如果它的值等于左上角的值+1
然后遍历矩阵找出最大值 则找到最长公共子串的结尾字符 往前移动该块的值 则为最长公共子串的起始地址;
代码如下:
void FindLString(string &s1, string s2){int i = s1.length();int j = s2.length();int sum = 0;int pos = 0;//开辟二维数组int **p = new int *[i];for (int k = 0; k < i; k++){p[k] = new int[j];}for (int ii = 0; ii < i; ii++){for (int jj = 0; jj < j; jj++){p[ii][jj] = 0;if (s1[ii]==s2[jj]){if (ii>0 && jj>0){p[ii][jj] = p[ii - 1][jj - 1] + 1;if (p[ii][jj]>sum){sum = p[ii][jj];pos = jj;}}else{p[ii][jj] = 1;}}}}for (int k = 0; k < i; k++){delete p[k] ;}for (int ii =pos-sum+1; ii <pos+1; ii++){cout << s2[ii];}}int _tmain(int argc, _TCHAR* argv[]){string a = "abcdefghaffheryeotwt";string b = "bdeabcdffhertweituwet";FindLString(a, b);return 0;}
ps:该代码只能求得一个最长公共子串 ,如果有多个 应该保存下来再输出
0 0
- 求最长连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长连续公共子串
- 求两字符串的最长公共连续子串
- 求两字符串最长公共连续子串---C++编程
- 求最长连续递增公共子序列
- 最长公共连续子串
- 最长公共连续子串
- 最长连续公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- 求最长公共子串
- Java ClassLoader详解及应用(写的挺好的)
- Arcgis for Silverlight的图例Legend默认折叠
- linux下service的命令用法
- javacc 6 生成 C++
- iGrimace 安装检查及卸载
- 求最长连续公共子串
- 如何关闭ipv6
- python学习之--Hello World
- Android JUnit Test的使用
- iOS系统 查看40位设备标识(UDID)
- Intellij IDEA 14.0 破解jrebel6.0.2
- strcmp,stricmp,strcmpi的区别
- struts上传文件,验证失败表单数据丢失的原因
- Linux目录/etc/init.d 与 /etc/rc.d/init.d