可转换最长子串
可转换最长子串
题目描述
有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。.
输入描述:
第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。
输出描述:
输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。
示例1
输入
8 1
aabaabaa
输出
5
说明
把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。
思路:
用滑动窗口法
代码:
#include<stdio.h>
int main(){
char c[500001];
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%c",&c[i]);
}
int r=0,l=0,maxl=0,an=0,bn=0;
while(r<n){
if(c[r]=='a') an++;
else bn++;
if(an<=m||bn<=m){
r++;
}else{
if(r-l>maxl) maxl = r-l;
if(c[l]=='a'){
an--;
l++;
}else{
bn--;
l++;
}
r++;
}
}
if(r-l >maxl) maxl = r-l;
printf("%d",maxl);
}
代码效率:
运行时间:4ms, 超过61.29%用C提交的代码
占用内存:416KB, 超过83.87%用C提交的代码
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!