给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意: 字符串长度 和 k 不会超过 104。
class Solution { public int characterReplacement(String s, int k) { //特判 if (s == null || s.length() == 0) return 0; //滑动窗口 int[] map = new int[26]; //用于统计相连的重复字母个数(每个下标代表一个字母) char[] ch = s.toCharArray(); int maxCount = 0; //出现过的最长的相连重复字母个数 //每次循环,right都向右走一步(left和right代表窗口的左右边) int left = 0; for (int right = 0; right < ch.length; right++) { //从ch数组中取一个字符,添加到数组中的是相连的重复字母个数 map[ch[right] - 'A']++; //比较连续的重复字符个数 maxCount = Math.max(maxCount, map[ch[right] - 'A']); //因为right走了一步,需要判断left是否需要移动,如果left不动,窗口就扩大一格 //窗口的长度是出现过最长的相连的重复字母个数,窗口的扩增需要保证maxCount+k大(即连续重复字符个数加k超过历史最长) if (right - left + 1 > maxCount + k) { //进来这里,说明窗口是扩增,left需要和right一起走一步 //并且去掉map数组中left字符的数 map[ch[left] - 'A']--; left++; } } //数组长度减去left等于窗口的长度,即最长重复字符数 return ch.length - left; } }对于小白来说,滑动窗口挺难理解的,各种细节也很模糊,不知道为什么这么做,代码为什么这么写,看了别人的题解后也是似懂非懂。 看了migoo大佬的题解后,还是有些懵,然后就这里看看百度搜搜,花了一个多小时来理解,上面是根据自己理解写的注释,希望对你有帮助。 滑动窗口我觉得重点在于窗口左边什么时候动。
