LeetCode 🟡 1405. Longest Happy String
🔗 🟡 1405. Longest Happy String 1821
tags: Weekly Contest 183
字串(String)
貪心(Greedy)
堆積(Heap)
題意
若一個字串 滿足以下條件,我們稱它為 快樂字串:
- 只包含字母
'a'
、'b'
和'c'
。 - 不包含
"aaa"
、"bbb"
或"ccc"
作為子字串。 - 含有的字母
'a'
的次數 最多 為 。 - 含有的字母
'b'
的次數 最多 為 。 - 含有的字母
'c'
的次數 最多 為 。
給定三個整數 、 和 ,返回 最長可能的快樂字串。如果有多個最長的快樂字串,返回其中 任意一個。如果沒有這樣的字串,返回空字串 ""
。
約束條件
思路:貪心(Greedy) + 堆積(Heap)
此問題的核心在於如何在滿足各種限制條件下,生成最長的快樂字串。注意到當某個字母剩餘數量超出其他字母越多時,越容易使得字串不滿足條件。因此我們可以基於 貪心(Greedy) 思路,在構造字串的過程中,優先選擇剩餘數量最多的字母,並且在遇到連續三個相同字母時,選擇次多的字母,以此保證字串的長度最大化。
而為了選擇剩餘數量最多的字母,我們可以利用 堆積(Heap) 的特性,維護一個 最大堆積(Max Heap) ,堆積中的每個元素為 ,其中 為字母, 為該字母的剩餘數量。
- 每次取出堆頂的字母,若該字母與結果字串最後兩個字母不同,則將其添加到結果字串中,並將其剩餘數量減一,並重新推入堆中。
- 若該字母與結果字串最後兩個字母相同,則嘗試從堆中取出次多的字母來避免三連續相同字母的情況,並按相同方式處理。
- 若次多的字母已經用盡,則提前結束。
複雜度分析
- 時間複雜度:,其中 是字母的種類數量,本題中 。
- 每次操作堆的時間複雜度是 ,而我們最多進行 次操作。
- 空間複雜度:
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!
總感覺寫過類似但字母數量更多的題目。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus