【Leetcode】424. Longest Repeating Character Replacement

来源:互联网 发布:linux 创建swap 编辑:程序博客网 时间:2024/06/17 07:32

题目:https://leetcode.com/problems/longest-repeating-character-replacement/#/description

题目给定一个string和一个k。最多可以把k个字符更改,且更改以后必须相同。返回最长的连续的相同字符数目。

这个题目可以在On内解决,使用滑动窗口的思想。两个指针start和end,end向后移动,每一次都找出start到end这个窗口内出现次数最多的字符,那么这个窗口内就应该把其余的字符改成这个字符。需要更改的数目是end - start + 1 - maxCount。如果说数目大于k,那么需要start向后移动。

有一个问题,start向后移动了以后,刚被移出窗口的字符的数目要减少一,如果说这个字符是最大count,那么可能需要修改当前最大count,不过其实不需要。因为,如果包含了另一个字符也有相同的数目,那么这种情况明显不许需要,最大count还可以延续使用。如果只有当前字符对应最大count,那么移出之后,最大count肯定减少1,这种情况理应更新,但是可以不更新,我们只要维持当前的窗口大小即可,虽然这个窗口可能不合法(因为用的是之前的maxcount)。不变窗口大小,是因为我们只关注最大值,所以,只要窗口内最大count无法超过之前的值,那么就永远无法更新结果的最大值。省去更新最大count的操作既不影响结果值,又可以降低复杂度,因此是一个很好的方法。

代码:

public int characterReplacement(String s, int k) {    int max = 0, start = 0, end = 0, max_cur = 0;    int[] count = new int[26];    while(end < s.length()){        max_cur = Math.max(max_cur, ++count[s.charAt(end) - 'A']);        while(end - start + 1 - max_cur > k)            count[s.charAt(start++) - 'A']--;        max = Math.max(max, end - start + 1);        end++;    }    return max;}

最后说一下为什么滑动窗口的方法可以得到最优解。因为,第一次延伸end可以得到起始位置为0的子串的结果。当end太大,不满足条件时,start前移一次,继而end又可以后移得到start在1处的最优解。。。持续下去,最终可以得到start在所有位置的解,从而得到最优解。滑动窗口实际上是得到了start在所有位置的子串的结果,但确是一个On级别的算法。

0 0
原创粉丝点击