动态规划:最长连续字串

/*
	使用动态规划求解最长连续字串 
	如"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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值