2020牛客寒假算法基础集训营1H题 nozomi和字符串

题目描述:
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 \mathit{“01”}“01”串而言,每次操作可以把 \mathit00 字符改为 \mathit11 字符,或者把 \mathit11 字符改为 \mathit00 字符。所谓\mathit{“01”}“01”串,即只含字符 \mathit00 和字符 \mathit11 的字符串。
nozomi有最多 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。(G题)
在这里插入图片描述
分析:此题也是一个处理字符串的题目,在我看来本题的难点在于最长,因此无法 像G题般找出刚符合符合条件的字串然后在首尾相减,于是要用到另一个算法,尺取法。
代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
char a11[200100];
int myfunction(char a,char a1)
{
	int r=0,l=0,change=0,ans=0;//r为右指针,l为左指针
	for(int i=0;i<n;i++)
	{
		if(a11[i]==a)
		{
			if(change<k)//还未达到k次操作时右指针向右移
			{
				change++;
				r++;
			}
			else
			{
				while(a11[l]!=a&&l<=r)
				l++;//此时操作次数已满,左指针像右移直到指向a
				l++;
				r++; //左右指针同时右移,纳入一个a,抛弃一个a,此时a的数量依然为k,再判断此串的长度
			}
		}
		else
		r++;//不消耗操作次数,右指针像右移
		ans=max(ans,r-l);
	}
	return ans;
}
int main()
{
	cin>>n>>k;
	scanf("%s",&a11);
	cout<<max(myfunction('0','1'),myfunction('1','0'));
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值