求两个字符串的最长的连续公共子串和求两个字符串的公共子序列
2014-11-08 11:33
239 查看
这与求两个字符串的公共子序列要区分开,见http://blog.csdn.net/shandianling/article/details/7888050<br/>
但 求你方法与求公共子序列类似,而且要简单一点。<br/>
方法:动态规划.
循环遍历两个字符串,查找当s1[i]==s2[k] 的情况 然后保存在c[i][k]中,c[i][k]=c[i-1][k-1]+1 最后我们会得到类似以下矩阵
OK,结果可以看出来了。
但 求你方法与求公共子序列类似,而且要简单一点。<br/>
方法:动态规划.
循环遍历两个字符串,查找当s1[i]==s2[k] 的情况 然后保存在c[i][k]中,c[i][k]=c[i-1][k-1]+1 最后我们会得到类似以下矩阵
#include <stdio.h> #include <stdlib.h> #include <string.h> //求公共子串(连续),注意跟求公共子序列有区别 int lcstr( const char* s1,const char* s2) { //clen保存公共子串的最大长度,s1_Mindex保存 s1公共子串的最后一个元素的位置 int len1,len2,i,k,cLen=1,s1_Mindex=0; int **c; if(s1==NULL || s2==NULL) return -1; len1=strlen(s1); len2=strlen(s2); if(len1< 1 || len2 < 1) return -1; c=malloc(sizeof(int*)*len1); for(i=0;i<len1;i++) { c[i]=(int *)malloc(len2*sizeof(int)); memset(c[i],0,len2*sizeof(int)); } /**********init end!*************/ for(i=0;i<len1;i++) { for(k=0;k<len2;k++) { if(i==0 || k==0) { if(s1[i]==s2[k]) c[i][k]=1; else c[i][k]=0; } else { if (s1[i] == s2[k]) { c[i][k] = c[i - 1][k - 1] + 1; if (cLen < c[i][k]) { cLen = c[i][k]; s1_Mindex = i; } } } } } //*************// // printf the one of lcs 只是其中一条,如果存在多条。 for(i=0;i<cLen;i++) { printf("%c",*(s1+s1_Mindex-cLen+1+i)); } /*****free array*************/ for(i=0;i<len1;i++) free(c[i]); free(c); return cLen; } int main(void) { char a[]="abcgooglecba"; char b[]="cbagoogleABVC"; printf("\nlcstr = %d\n",lcstr(a,b)); return 0; }
OK,结果可以看出来了。
相关文章推荐
- 两个字符串的最长公共子串(子串为连续的)
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 字符串操作:两个字符串的最长连续公共子串
- 求两个字符串的最长连续公共子串
- 多个字符串的公共最长连续子串(对两个字符串的扩展)
- 两个字符串的最长连续公共子串
- 求两个字符串的最长公共子串(包括连续和非连续)
- 两个字符串的最长连续公共子串
- 求两个字符串的最长的连续公共子串
- 最长公共子串序列一之 两个字符串的最长公共子串
- 求两个字符串的最长的连续公共子串
- 最长公共子串序列一之两个字符串的最长公共子序列
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串(按位异或法)
- 求两个字符串的最长的连续公共子串
- 求两个字符串的(连续的)最长公共子串
- 两个字符串的最长连续公共子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- poj 2774 Long Long Message 求两个字符串的最长公共子串 后缀数组
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离