424.替换后的最长重复字符
方法:滑动窗口
- 右边界先移动找到一个满足题意的可以替换k个字符以后,所有字符都变成一样的当前看来最小的子串,直到右边界纳入一个字符以后,不能满足的时候停下
- 然后考虑左边界右移,左边界只须向右移动一格以后,右边界就又可以开始向右移动了,继续尝试找到更长的目标子串
- 替换后的最长重复子串就产生在右边界、左边界交替向右移动的过程种
class Solution {
public int characterReplacement(String s, int k) {
int len = s.length();
if(len < 2){
return len;
}
char[] charArray = s.toCharArray(); //将字符串转换为字符数组
int left = 0; //定义滑动窗口的左右边界
int right = 0;
int res = 0;
int maxCount = 0;
int[] freq = new int[26];
//[left,right)内最多替换k个字符可以得到只有一种字符的子串
while(right < len){
freq[charArray[right] - 'A']++;
//在这里维护maxCount,因为每一次右边界读入一个字符,字符频数增加,才会使得maxCount增加
maxCount = Math.max(maxCount,freq[charArray[right] - 'A']);
right++;
if(right - left > maxCount + k){ //此时左边界为left,而右边界继续向右移动,使得长度更长,这个子串一定不是最长子串,需要将左边界右移
//说明此时k不够用
//把其他不是最多出现的字符替换以后,都不能填满这个滑动的窗口,这个时候必须要考虑左边界向右移动
//移出滑动窗口的时候,频数数组必须要相应地做减法
freq[charArray[left] - 'A']--;
left++;
}
res = Math.max(res,right-left);
}
return res;
}
}