/*
使用动态规划求解最长连续字串
如"abcgooglecba"与"cbagoogleabc"的最长连续字串为google
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
/*
这里没有编写错误处理(字串为空,空间不足等)
可以根据需求来进行处理,并返回相应的参数
*/
int lcstr(const char *s1,const char *s2,char *sub)
{
/*
cLen记录当前最大长度
index记录当前最大长度时字串在s1中的最大索引
这两个数据可以确定字串
*/
int m,n,i,j,cLen=0,index=0;
m=strlen(s1);
n=strlen(s2);
/*
Xi={x1,x2,x3..,xi}
Yj={y1,y2,y3..,yj}
c[i][j]用来存储Xi和Yj的最长连续字串的长度
*/
char c[MAXLEN][MAXLEN];
memset(c,0,sizeof(c));
for(i=0;i<m;++i)
{
for(j=0;j<n;++j)
{
//初始化首行首列
if(i==0||j==0)
{
if(s1[i]==s2[j])
c[i][j]=1;
else
c[i][j]=0;
}
else
{
/*
如果Xi最后一个元素不等于Yj最后一个元素,
则表示当前Xi跟Yj最长子序列等于Xi-1跟Yj-1最长子序列后面加上x[i](y[j])
长度等于Xi-1跟Yj-1最长子序列长度加1
*/
if(s1[i]==s2[j])
{
c[i][j]=c[i-1][j-1]+1;
//更新cLen跟index
if(cLen<c[i][j])
{
cLen=c[i][j];
index=i;
}
}
}
}
}
strncpy(sub,s1+index-cLen+1,cLen);
sub[cLen]='\0';
return 0;
}
int main()
{
char a[]="abcgooglecba";
char b[]="cbagoogleabc";
char sub[10];
lcstr(a,b,sub);
printf("%s\n",sub);
return 0;
}
动态规划:最长连续字串
最新推荐文章于 2021-03-17 23:45:01 发布