题目
你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。
对于每次操作,你可以选择一个位置 i 满足 1≤i≤n,翻转这一位的值,0变成1,1变成0。
定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。
输入描述:
第一行一个整数 T ,表示接下来有 T 个样例。
首先输入n,m,表示S串的长度n和操作次数m,其中1≤n≤100000,0≤m≤1000;
接下来输入一个长度为n的字符串S。
输出描述:
一个整数,表示题面上描述的最大价值。
示例1
输入
2
5 1
00101
2 1
01
输出
4
2
说明
第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。
分析
尺取法
设置两个指针,两个指针都初始化在开始位置
第一个指针每往后移动一个位置,第二个指针都相应往后遍历一遍(每次从第一个指针的位置开始)该题第一个指针(遍历)确定后,第二个指针每次从第一个指针开始处遍历到最远距离,它们的距离即为最大价值。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int t = cin.nextInt();
while(t-- > 0){
int n = cin.nextInt();
int m = cin.nextInt();
String s = cin.next();
System.out.println(Math.max(getAns(s, m, '0'), getAns(s, m, '1')));
}
cin.close();
}
private static int getAns(String s, int k, char c) {
int len = s.length();
int l = 0;
int r = 0;
int ans = 0;
while(l < len){
int m = k;
if(s.charAt(l) != c){
if(m > 0){
m --;
}else{
l ++;
continue;
}
}
r = l + 1;
while(r < len){ //第二个指针找最大满足条件的位置
if(s.charAt(r) != c){
if(m <= 0){
break;
}
m --;
}
r ++;
}
ans = Math.max(ans, r-l); //两指针距离即为当前最大价值
l ++;
}
return ans;
}
}
如有错误或不合理的地方,敬请指正~
加油|!!