最长子串

求最长公共字符串问题

一道简单的动态规划问题
本题的大概意思是输入两个字符串(这里假设字符串长度不超过不大于100),求出两个字符串的公共最长子串。

首先根据题意创建需要的字符数组,这里创建两个长度为105的字符数组。和一个用来储存数据的二维数组dp[][]={0}(并初始化数组)。
由于要求出两个字符串的最长公共子串,所以每一个位置都要进行比较看是否相等,所以用两个for循环来遍历两个字符数组。
如果if(C[a]==D[b])说明这两个位置的字符相等,那么数组D[b]此位置的字符有两种情况
1.这个字符是一个公共子串的开头 2.它处于一个公共子串中。
所以要将这两种情况列出
1.D[b]字符处于一个公共子串的中,此时应用dp[a][b]= dp[a-1][b-1]+1,意思是D[b]这个字符处于的子串长度加一。

if(C[a-1]==D[b-1])
			{
			dp[a][b]=dp[a-1][b-1]+1;
			if(dp[a][b]>max)max=dp[a][b];
	        }

然后在dp时用max记录当前最大的子串,最后max保存的就是最长子串的长度

2.第二种情况是D[b]字符是一个 子串的开端 if(C[a-1]!=D[b-1])那么这里就要将这个子串的长度设为1 所以 dp[a][b]=1;

 else dp[a][b]=1;

#include<stdio.h>
#include<string.h>
int main()
{
	int a,b,c,d,max=0;
	int dp[105][105]={0};
	char C[105],D[105];
    scanf("%s",C);
	scanf("%s",D);
	c=strlen(C);
	d=strlen(D);
	for(a=0;a<c;a++)
	for(b=0;b<d;b++)
	{
		if(C[a]==D[b]){
			if(C[a-1]==D[b-1])
			{
			dp[a][b]=dp[a-1][b-1]+1;
			if(dp[a][b]>max)max=dp[a][b];
	        }
	        else dp[a][b]=1;
		}
	 }
	 printf("%d\n",max);
	 return 0; 
}

蒟蒻刚进门,还请大佬指教!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值