当前位置: 代码迷 >> C语言 >> [求助]求两个字符串的最大公共子串
  详细解决方案

[求助]求两个字符串的最大公共子串

热度:120   发布时间:2007-04-24 21:47:45.0
[求助]求两个字符串的最大公共子串
前些天老师布置了一个这样的题,我想了好久都没有思路,蛮困惑的。
不知道哪位有一些有的算法,把你们的思路和我分享一下吧。
搜索更多相关的解决方案: 字符  

----------------解决方案--------------------------------------------------------
设两个数组 char a[20],b[20]; char *p=a,*q=b;
先找出*p在数组b中相同的字符*(q+i),若没有则判断*(p+1),若有则接着判断*(p+1)与*(q+i+1)是否相等,若相等则继续,如此下去直到遇到不相等的或数组b越界,结束本次比较(一次循环)..记录下相同字符的个数以及第一个相同字符在任意一个数组中的地址(为最后输出所用)。。。。。如此判断下去,直到第一个数组比较结束,则就可以找出最大公共字符串
----------------解决方案--------------------------------------------------------

哦 知道了。。。谢过


----------------解决方案--------------------------------------------------------

上面说的我不知道可行,不过我们现在在上的算法设计中就一个对于这个问题的解法,好像用的是动态规化吧!


----------------解决方案--------------------------------------------------------

这是动态规划 我看不懂,觉得用2楼的方法就可以了. 问一句: kmp属于动态规划吗?
动态规划如下:
include <stdio.h>
# include <string.h>
# define N 100
char a[N],b[N],str[N];

int lcs_len(char *a, char *b, int c[ ][ N])
{ int m=strlen(a), n=strlen(b), i,j;
for (i=0;i<=m;i++) c[i][0]=0;
for (i=0;i<=n;i++) c[0][i]=0;

for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
if (a[i-1]==b[j-1])
c[i][j]=c[i-1][j-1]+1;
else if (c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
return c[m][n];
}

char *buile_lcs(char s[ ],char *a, char *b)
{ int k, i=strlen(a), j=strlen(b);
k=lcs_len(a,b,c);
s[k]=’\0’;
while (k>0)
if (c[i][j]==c[i-1][j]) i--;
else if (c[i][j]==c[i][j-1]) j--;
else { s[--k]=a[i-1];
i--; j--;
}
return s;
}

void main()
{ printf (“Enter two string(<%d)!\n”,N);
scanf(“%s%s”,a,b);
printf(“LCS=%s\n”,build_lcs(str,a,b));
}


----------------解决方案--------------------------------------------------------
  相关解决方案