最长公共子串

在这里插入图片描述
这题本来想用双重循环暴力找到最长字串,但sh大佬提醒我得先找到相同的一处再进行循环。循环后还得根据k是否有剩下来判断能否再增加(其中还得判断增加的位置两个字符串是否都存在)

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	int k,max=0,min;
	char a[501],b[501];
	cin>>k;
	scanf("%s%s",a,b);
	int la=strlen(a),lb=strlen(b);
	if(la>lb) min=lb;
	else min=la;//找出最短的那个字符串长度
	for(int i=0;i<la;i++)
	{
		for(int j=0;j<lb;j++)
		{
			if(a[i]==b[j])//开始循环
			{
				int f=0,k1=k,sa=i,sb=j,temp1,temp2;
				for(temp1=i,temp2=j;temp1<la&&temp2<lb;temp1++,temp2++)
				{
					if(a[temp1]!=b[temp2])
					{
						if(k1--)
						{
							f++;continue;
						}
						else
						{
							if(f>max)
							{
								max=f;
								break;
							}
						}
					}
					else f++;
				}
				if(k1)
				{
					if((sa>=k1&&sb>=k1)||(la-temp1>=k1&&lb-temp2>=k1))//判断是否还有位置
					{
						if(f+k1<=min) f+=k1;
						else f=min;
					}
					
				}
				if(f)
				{
					if(f>max) max=f;
				}
			}
		}
	}
	if(!max)
	{
		if(k>=min) max=min;
		else max=k;
	}
	cout<<max;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值