描述
有一个仅包含’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' 子串。
解题思路:
我们可以使用滑动窗口的方法来解决这个问题。首先,我们需要找到最长的连续相同字符的子串,然后考虑如何在操作次数限制范围内将其转换为全部相同的字符。
具体来说,我们可以使用两个指针left和right来表示当前滑动窗口的左右边界,初始值为0。然后,我们可以遍历整个字符串,如果当前字符与左边界的字符相同,则将右边界向右移动一位,否则,我们需要考虑如何将当前子串转换为全部相同的字符。
具体来说,我们可以计算当前子串中不同字符的数量diff,如果diff大于操作次数m,则无法将当前子串转换为全部相同的字符,我们需要将左边界向右移动一位,直到当前子串中不同字符的数量小于等于操作次数m。在这个过程中,我们可以使用一个哈希表来记录当前子串中每个字符出现的次数,以便于计算不同字符的数量。
最后,我们可以返回最长的连续相同字符的子串的长度。
Java代码实现:
```
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static int getMaxSameLength(String s, int m) {
int n = s.length();
int left = 0, right = 0;
int maxLen = 0;
HashMap<Character, Integer> countMap = new HashMap<>();
while (right < n) {
char c = s.charAt(right);
countMap.put(c, countMap.getOrDefault(c, 0) + 1);
while (countMap.get(c) > 1) {
char leftChar = s.charAt(left);
countMap.put(leftChar, countMap.get(leftChar) - 1);
left++;
}
int diff = right - left + 1;
if (diff <= m) {
maxLen = Math.max(maxLen, diff);
} else {
left++;
}
right++;
}
return maxLen;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
String s = scanner.next();
int maxLen = getMaxSameLength(s, m);
System.out.println(maxLen);
}
}
```