查找两个字符串中最长的公共子串,可能出现最长长度相同的公共子串!该如何解决
查找两个字符串中最长的公共子串,可能出现最长长度相同的公共子串!!
功能还不是很完善,程序也很笨拙,这里没有用到高级的算法,有没有什么捷径可以让该程序完善?希望高手指点一下,
比如
char a[]="abcaadybc";
char b[]="kbcdadwbc";
最长公共子串长度是2;满足条件的有bc,ad,bc。(这个bc应该只输出一次就好了)
------解决方案--------------------
我试着写了一下,没有用子函数的形式,算法思想比较简单。
以字符数组a作为循环,分别求以a第一个字符、第二个字符,。。。,第strlen(a)个字符打头的最长公共串。从而求出最长公共字串。
写完程序后发现有问题,要是有两个以上且不相等的最长公共串,就出现问题了,不过用二维数组去储存也许不会出现问题,但是问题就变得复杂了。或许真得像楼主一样,先计算出最长公共串的长度再求公共串。
功能还不是很完善,程序也很笨拙,这里没有用到高级的算法,有没有什么捷径可以让该程序完善?希望高手指点一下,
比如
char a[]="abcaadybc";
char b[]="kbcdadwbc";
最长公共子串长度是2;满足条件的有bc,ad,bc。(这个bc应该只输出一次就好了)
- C/C++ code
#include <stdio.h> #include <stdlib.h> #include <string.h> int longest_length_of_comstr(char *str1, char *str2); int find_the_longest_comstr(char *str1, char *str2); int find_the_longest_comstr(char *str1, char *str2) { int maxlen=longest_length_of_comstr(str1,str2); int len; int num=strlen(str1) > strlen(str2) ? strlen(str1)+1 : strlen(str2)+1; char *p,*q,*tmp1,*tmp2,*maxi; char *comstr=(char *)malloc(sizeof(char)*num); for (q=str1; *q!=0; q++) for (p=str2; *p!=0; p++) { len=0; tmp1=q; tmp2=p; while (*tmp1 && *tmp2 && *tmp1==*tmp2) { tmp1++; tmp2++; len++; } if(len == maxlen) { maxlen=len; maxi=q; strncpy(comstr,maxi,maxlen); *(comstr+maxlen)=0; printf("%s\n",comstr); break; } } free(comstr); return 0; } int longest_length_of_comstr(char *str1, char *str2) { int maxlen=0; int len; char *p,*q,*tmp1,*tmp2; for (q=str1; *q!=0; q++) for (p=str2; *p!=0; p++) { len=0; tmp1=q; tmp2=p; while (*tmp1 && *tmp2 && *tmp1==*tmp2) { tmp1++; tmp2++; len++; } if(len > maxlen) { maxlen=len; } } return maxlen; } int main(void) { char a[]="abcaadybc"; char b[]="kbcdadwbc"; find_the_longest_comstr(a,b); return 0; }
------解决方案--------------------
我试着写了一下,没有用子函数的形式,算法思想比较简单。
以字符数组a作为循环,分别求以a第一个字符、第二个字符,。。。,第strlen(a)个字符打头的最长公共串。从而求出最长公共字串。
写完程序后发现有问题,要是有两个以上且不相等的最长公共串,就出现问题了,不过用二维数组去储存也许不会出现问题,但是问题就变得复杂了。或许真得像楼主一样,先计算出最长公共串的长度再求公共串。
- C/C++ code
int main(void) { char a[]="abcaadybc"; char b[]="kbcdadwbc"; // find_the_longest_comstr(a,b); //先假设b的长度小于a的长度 int i,j,maxLength; int aLen = strlen(a) ; int bLen = strlen(b) ; char *comstr,*tempstr ; comstr = (char * )malloc(sizeof(char)*bLen) ; tempstr = (char * )malloc(sizeof(char)*bLen) ; maxLength = 0 ; j = 0 ; for(i=0; i< aLen;i++) { int templen = 0 ; int tempi = 0; int point = 1 ; while((tempi < aLen) && (j < bLen)) { while(a[tempi] == b[j]) { tempstr[templen++] = b[j] ; tempi++ ; j++ ; } if(templen > maxLength) { maxLength = templen ; strcpy(comstr,tempstr) ; } tempi = i ; point++ ; templen = 0 ; j = point ; } j = 0 ; } printf("%s\n",comstr) ; getchar() ; return 0; }