import java.util.Scanner;
/**
* @author Green.Gee
* @date 2023/1/16 14:07
* @email green.gee.lu@gmail.com
*/
public class DynamicPlan_3 {
/**
* 描述
* 有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);
* 但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
* <p>
* 输入描述:
* 第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。
* <p>
* 输出描述:
* 输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。
* <p>
* 示例1
* 输入:
* 8 1
* aabaabaa
* 输出:
* 5
* 说明:
* 把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String l1 = in.nextLine();
String[] arr = l1.split(" ");
int n = Integer.parseInt(arr[0]);
int m = Integer.parseInt(arr[1]);
String l2 = in.nextLine();
System.out.println(slidingWindows(n, m, l2));
}
}
public static int slidingWindows(int n, int m, String s) {
int left = 0, right = 0;
int an = 0, bn = 0;
int res = 0;
while (right < n) {
if (s.charAt(right) == 'a') {
an++;
} else {
bn++;
}
if (an <= m || bn <= m) {
right++;
} else {
res = Math.max(res, right - left);
if (s.charAt(left) == 'a') {
an--;
} else {
bn--;
}
left++;
right++;
}
}
res = Math.max(res, right - left);
return res;
}
}
贪心算法(滑动窗口)-byte-3
最新推荐文章于 2024-07-17 21:45:27 发布