题目链接
https://leetcode.com/problems/longest-repeating-character-replacement/
题目描述
给定仅由大写英文字母组成的字符串s,可以将任意位置上的字符替换为其他字符,最多可以替换k次。在执行上述操作后,找到包含重复字母的最长子串的长度。字符串长度和k不会超过10^4。
示例
输入:s = "AABABBA",k=1
输出:4
将中间的一个'A'替换为‘B’,字符串变为"AABBBBA". 子串"BBBB"有最长重复字母,因此答案为4.
解题思路
这类题是比较经典的滑动窗口问题。给定k,要想使替换后所有字符都一样,并且重复、连续的部分更长,我们应该替换出现次数最多字符以外的字符。由于我们找的是最长子串,那么如果窗口内能够在最多替换k个字符后所有的字符都相同,右边界就继续右移。如果不满足这个条件就固定右边界,开始移动左边界。
我们考虑两个问题:
(1)左指针开始移动的条件是什么?
右指针的每次移动需要使得窗口内的子数组能够满足最多替换k个字符后,所有的字符都相同。当右指针移动到窗口内最多出现的字符次数(记为max_occurence)+k<right-left时,替换k次也无法使得子数组内字符都相同,此时左指针开始移动。
(2)左右指针右移时要更新的数据有哪些?
左右指针右移时要更新新加入窗口的字符的出现次数。
下面举例s = "AABABBA",k=1来说明算法步骤:
由于窗口内元素只有A,不需要替换字符,因此更新最长重复子串长度为1,right可以继续右移。
窗口内元素为[A,A],不需要替换字符,因此更新最长重复子串长度为2,right继续右移。
窗口内元素为[A,A,B],由于窗口内出现次数最多的字符为A,出现次数为2次。2+k == right-left,将B替换为A即可得到重复子串"AAA"。