滑动窗口
public static int characterReplacement(String s, int k) {
//规定特殊情况
if (s == null) {
return 0;
}
char[] cs = s.toCharArray();
//设定一个26长度的数组,给窗口内出现的字母计数
int[] map = new int[26];
//左窗口、右窗口、搜索窗口长度
int left = 0;
int right = 0;
int maxlen = 0;
//限定在s字符串内
while(right<s.length()){
//给出现的编号并且计数
int index = cs[right] - 'A';
map[index]++;
//每一次都去更新当前最大窗口长度
maxlen = Math.max(maxlen, map[index]);
//当前窗口 与 替换K次最大长度比较
//小于:证明当前窗口替换完,窗口内都是重复字母
//大于:证明当前窗口替换完,存在不是重复字母的情况
if (right - left + 1 > maxlen + k) {
//左窗口的字母即将移除,计数-1
map[cs[left] - 'A']--;
//左窗口右移
left++;
}
//右窗口左移
right++;
}
//计算当前最大窗口
return cs.length - left;
}
学以致用
- char-char返回int
‘B’-‘A’=1
限定在字符串内时(步骤总结)
- 1、从第一个字母开始,给字母编号并且计数
- 2、每次跟新窗口内最多重复字母个数maxlen
max(窗口内最大,当前字母在窗口内出现次数) - 3、窗口长度 与 maxlen+可替换次数k次
大于:证明替换后仍然不全是重复字母,需要更新窗口长度(执行第四步)
小于:替换完当前窗口全是重复字母(执行第五步) - 4、左窗口的字母对应编号–
左窗口右移 - 5、右窗口右移
- 继续第一步
- s字符串走到尽头时:返回字符串长度-左窗口位置
总结:
假如窗口长度变为5,那么之后的窗口只会扩大,不会缩小 ,最大窗口由maxlen+k决定
所以最后才会返回字符串长度-左窗口位置