杭电2668

简单dp,就是求最长连续不相等的子串,只需遍历即可,

i从0--n遍历:(s1-s2为当前的子串,max为当前最长子串)

1,如果不等与s1--s2内的任何字符,s2++;i++;

2,如果等于x(s1<x<s2),则(如果s2-s1大于max,更新max值)令s1=x,s2=i,i++继续搜寻;





#include<stdio.h>
char a[10000003];
int main()
{
	int n,i,k,s1,s2,max,f,x1,x2;

	while(scanf("%d",&n)!=EOF)
	{
		scanf("%s",a);
		s1=s2=x1=x2=0;
		max=1;
		for(i=1;a[i]!='\0';i++)
		{
			f=1;
			for(k=s2;k>=s1;k--)  //判断是否与s1-s2中的字符相等
			{
				if(a[k]==a[i])  //相等
				{
					if(s2-s1+1>max)//如果子串比当前最大子串大,更新最大子串max;
					{
						x1=s1;
						x2=s2;
						max=s2-s1+1;
					}
					s1=k+1; //当前子串为k-i;赋值给s1,s2,继续查找;
					s2=i;
					f=0;
					break;
				}
			}
			if(f)  //如果都不等,当前子串增加1;
				s2++;
		}
		if(s2-s1+1>max)
		{
			x1=s1;
			x2=s2;
			max=s2-s1+1;
		}
		printf("%d %d %d\n",max,x1,x2);
	}
	return 0;
}	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值