Leetcode # 424. Longest Repeating Character Replacement
- 2023.08.04
- ★★ Medium LeetCode Sliding Window
https://leetcode.com/problems/longest-repeating-character-replacement
Solution: Sliding Window
Time Complexity: O(len(s))
Space Complexity: O(len(s))
(The input and output generally do not count towards the space complexity.)
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
pos = collections.defaultdict(list)
for i, c in enumerate(s):
pos[c].append(i)
ans = min(1 + k, len(s))
for c in pos:
left = curr = 0
rest_k = k
for right in range(1, len(pos[c])):
# do logic here to add arr[right] to curr
rest_k -= pos[c][right] - pos[c][right - 1] - 1
while rest_k < 0:
# remove arr[left] from curr
left += 1
rest_k += pos[c][left] - pos[c][left - 1] - 1
# update ans
ans = max(ans, min(pos[c][right] - pos[c][left] + 1 + rest_k, len(s)))
print(c, ans, pos[c][left], pos[c][right], rest_k)
return ans
More Refined Solution
| max_frequency | := | max([s[start, end].count(c) for c in set(s[start, end])]) |
| not_valid | := | Current sliding window is valid or not |
| = | (end – start + 1) – max_frequency > k | |
| = | len(Current sliding window) – max_frequency > k | |
| = |
len([c for c in s if c != cmax_frequency]) > k |
Time Complexity: O(len(s))
Space Complexity: O(26) = O(1) (26 lowercase letters)
(The input and output generally do not count towards the space complexity.)
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
start = 0
frequency_map = collections.Counter()
max_frequency = 0
longest_substring_length = 0
for end in range(len(s)):
frequency_map[s[end]] += 1
max_frequency = max(max_frequency, frequency_map[s[end]])
not_valid = (end - start + 1) - max_frequency > k
if not_valid:
frequency_map[s[start]] -= 1
start += 1
longest_substring_length = end - start + 1
return longest_substring_length
Last Updated on 2023/08/16 by A1go