题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长。
用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变且改变次数用完就让i++更正改变次数,最后更新答案。时间复杂度O(n)。
另外,注意到k=0的情况。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char str[111111]; 6 int main(){ 7 int n,k; 8 scanf("%d%d%s",&n,&k,str); 9 int i=0,j=0,tmpn=0,tmpk=0,ans=0; 10 while(j<n){ 11 if(str[j]=='a'){ 12 ++tmpn; 13 }else if(k==0){ 14 tmpn=0; 15 }else{ 16 while(tmpk==k){ 17 if(str[i]=='b'){ 18 --tmpk; 19 } 20 --tmpn; 21 ++i; 22 } 23 ++tmpk; 24 ++tmpn; 25 } 26 ans=max(ans,tmpn); 27 ++j; 28 } 29 i=0; j=0; tmpn=0; tmpk=0; 30 while(j<n){ 31 if(str[j]=='b'){ 32 ++tmpn; 33 }else if(k==0){ 34 tmpn=0; 35 }else{ 36 while(tmpk==k){ 37 if(str[i]=='a'){ 38 --tmpk; 39 } 40 --tmpn; 41 ++i; 42 } 43 ++tmpk; 44 ++tmpn; 45 } 46 ans=max(ans,tmpn); 47 ++j; 48 } 49 printf("%d",ans); 50 return 0; 51 }