题目:
输入例子1:
8 1
aabaabaa
输出例子1:
5
例子说明1:
把第一个 ‘b’ 或者第二个 ‘b’ 置成 ‘a’,可得到长度为 5 的全 ‘a’ 子串。
解法:
分别求仅替换a或者b能得到的最长的区间,再求最大值。例如,对于替换a,我们遇到b时,进行一次替换,并且记录当前b的位置(这里我们记录所有b的位置),当替换次数小于等于m时,更新区间长度,当替换次数大于m时,取出一个b的位置(即上一个b的位置,我们这里用t记录),区间左端点移到这个位置,再去更新最值即可。
代码:
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
public static int change(String s,char op,int n,int m){
char[] ch=s.toCharArray();
int maxValue=0;
int l=0;
int x=0;
ArrayList<Integer> list=new ArrayList<>();
int t=0;
for(int i=0;i<ch.length;i++){
if(ch[i]!=op){
x++;
list.add(i);
}
if(x<=m){
maxValue=Integer.max(maxValue,i-l+1);
}else{
l=list.get(t++)+1;
x--;
maxValue=Integer.max(maxValue,i-l+1);
}
}
return maxValue;
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n,m;
String s;
n=sc.nextInt();
m=sc.nextInt();
s=sc.next();
System.out.println(Integer.max(change(s,'a',n,m),change(s,'b',n,m)));
}
}