424. Longest Repeating Character Replacement
題目網址:https://leetcode.cn/problems/longest-repeating-character-replacement/
題意:給一 string
s和一整數k, 你可以選擇將s中的任意字元變成其他大寫英文字母, 該操作最多執行k次。經上述操作後, 返回僅包含相同字元的最大 substring 長度。
s 由大寫英文字母所組成。

Solution 1:
想法:利用 Sliding Window, 將
window中的元素分成兩部分
- 出現頻率最多的元素
- 扣掉出現頻率最多的元素後,所剩餘的元素
若剩餘的元素個數
≤ k, 代表剩餘的元素可全部替換為頻率最多的元素。反之, 則不行。做完後, 更新res
class Solution { |
- time:$O(n)$ ➔ $O(26 \cdot n)$,
s中的每個元素最多被遍歷 2 次(left、right)- $O(26 \cdot n)$:while loop 中每次取
max_element()需 $O(26)$
- $O(26 \cdot n)$:while loop 中每次取
- space:$O(1)$ ➔
window
Solution 2:
想法: 改善 Solution 1, 將
max_element()提出, 變成在 while loop 外部維護, 而非在 while loop 中維護
- 能這樣做是因為在內層 while loop 中移除
window[s[left]]後,maxf只會越來越小- 也就是說
right - left - maxf(移除前) ≥ right - left - maxf(移除後)始終是成立的, 因為maxf(移除後) ≤ maxf(移除前)- 若
right - left - maxf(移除前) > k成立, 則right - left - maxf(移除後) > k也必定成立, 因此根本不必在 while loop 中更新maxf
class Solution { |
- time:$O(n)$ ➔
s中的每個元素最多被遍歷 2 次(left、right) - space:$O(1)$ ➔
window長度為 $O(26)$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論