Problem Statement
(Source) Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the above operations.
Note:
Both the string’s length and k will not exceed 104.
Example 1:
Input: s = "ABAB", k = 2 Output: 4 Explanation: Replace the two 'A's with two 'B's or vice versa.
Example 2:
Input: s = "AABABBA", k = 1 Output: 4 Explanation: Replace the one 'A' in the middle with 'B' and form "AABBBBA". The substring "BBBB" has the longest repeating letters, which is 4.
Solution
Idea: The problem says that we can make at most k changes to the string (any character can be replaced with any other character). So, let’s say there were no constraints about the k. Given a string convert it to a string with all same characters with minimal changes. The answer to this is
length of the entire string - number of times of the maximum occurring character in the string
Given this, we can apply the at most k changes constraint and maintain a sliding window such that
(length of substring - number of times of the maximum occurring character in the substring) <= k
class Solution(object):
def characterReplacement(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
from collections import Counter
n = len(s)
if k >= n - 1:
return n
res = k
start, end = 0, k
cnt = Counter(s[start : end + 1])
max_char_fre = cnt.most_common(1)[0][1]
for end in xrange(k + 1, n):
cnt[s[end]] += 1
max_char_fre = max(max_char_fre, cnt[s[end]])
while end - start + 1 - max_char_fre > k:
cnt[s[start]] -= 1
start += 1
max_char_fre = cnt.most_common(1)[0][1]
res = max(res, end - start + 1)
return res