leetcode424——替换后的最长重复字符
题目描述
题目大概意思是:给一个仅由大写字母组成的字符串,最多可替换k次任意位置上的字符为其他字符,执行完这个操作,找出来包含重复字母的最长子串长度;
滑动窗口
暴力解法:
枚举该字符串里面的所有子串,如果所有字符都相同就考虑更长的子串,否则找出出现次数最多的,替换掉除出现次数最多的之外的字符;
暴力解法做了很多重复的工作,有很多重复子串重复扫描
滑动窗口解法:
首先使用左右指针进行移动,右指针移动,左指针从0开始
右指针遍历途中,每次都+1,将当前字符个数+1,并重新计算当前出现次数最多的子串长度
然后判断窗口的长度-出现次数最多的子串长度 > k,如果说明此时k不够用,不能填满这个窗口,那么缩短左窗口,左边界前移,此时注意频数数组要对应减
这个时候记录该窗口的大小
最终循环结束,返回记录的窗口大小
点击查看代码
public static int characterReplacement(String s, int k) {
//首先找出频次最大的长度
int[] ints = new int[26];
int left = 0;
int count = 0;
int res = 0;
int right = 0;
while(right < s.length()) {
ints[s.charAt(right) - 'A']++;
count = Math.max(count, ints[s.charAt(right) - 'A']);
if (right - left + 1 - count > k) {
ints[s.charAt(left) - 'A']--;
left++;
}
res = Math.max(res, right - left + 1);
right++;
}
return res;
}

浙公网安备 33010602011771号