diff --git a/apps/docs/content/(hash-table)/3-longest-substring-without-repeating-characters.mdx b/apps/docs/content/(hash-table)/3-longest-substring-without-repeating-characters.mdx index b0f4f83..c5fbe45 100644 --- a/apps/docs/content/(hash-table)/3-longest-substring-without-repeating-characters.mdx +++ b/apps/docs/content/(hash-table)/3-longest-substring-without-repeating-characters.mdx @@ -35,12 +35,12 @@ class Solution: def lengthOfLongestSubstring(self, s: str) -> int: left = 0 ans = 0 - seen = set() + window = set() for right, c in enumerate(s): - while c in seen: - seen.remove(s[left]) + while c in window: + window.remove(s[left]) left += 1 - seen.add(c) + window.add(c) ans = max(ans, right - left + 1) return ans diff --git a/apps/docs/content/(hash-table)/424-longest-repeating-character-replacement.mdx b/apps/docs/content/(hash-table)/424-longest-repeating-character-replacement.mdx new file mode 100644 index 0000000..c807620 --- /dev/null +++ b/apps/docs/content/(hash-table)/424-longest-repeating-character-replacement.mdx @@ -0,0 +1,47 @@ +--- +title: '424. Longest Repeating Character Replacement' +description: You are given a string s and an integer k. You can choose any character of the string and change it to any other uppercase English character. You can perform this operation at most k times +sidebar: + label: 'Longest Repeating Character Replacement' + badge: 'Medium' +--- + +Sliding Window + +### 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`. There may exists other ways to achieve this answer too. + +### Constraints: + +- `1 <= s.length <= 10^5` +- `s` consists of only uppercase English letters. +- `0 <= k <= s.length` + +## Solution + +```py +class Solution: + def characterReplacement(self, s: str, k: int) -> int: + count = {} + res = 0 + + l = 0 + maxF = 0 + for r, c in enumerate(s): + count[c] = 1 + count.get(c, 0) + maxF = max(maxF, count[c]) + + while (r - l + 1) - maxF > k: + count[s[l]] -= 1 + l += 1 + + res = max(res, r - l + 1) + return res +```