题目:http://codeforces.com/problemset/problem/676/C
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
char a[maxn];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
//getchar();
scanf("%s",a);
int l=0,r=0,ans=0,cnt=0;
while(l<n&&r<n)
{
while((a[r]=='a'||cnt<k)&&r<n)
{
if(a[r]!='a')
cnt++;
r++;
}
ans=max(ans,r-l);
while(a[l]=='a'&&l<=r)
l++;
l++;
cnt--;
}
l=r=cnt=0;
while(l<n&&r<n)
{
while((a[r]=='b'||cnt<k)&&r<n)
{
if(a[r]!='b')
cnt++;
r++;
}
ans=max(ans,r-l);
while(a[l]=='b'&&l<=r)
l++;
l++;
cnt--;
}
printf("%d\n",ans);
}
在网上把的代码 学的尺取法。
感觉就像 在一层for 中找 从头开始找满足题意的答案 取最大的。
8 1 aabaabaa中
找到序列 aabaa 计算为5 其中i=0;j=5。。。。。。 将i=3,。
找到序列aabaa 计算为5 i=3。。。j=8。。。break;
时间复杂度为O(n)。