↓快轉到主要內容
  1. LeetCode/

LeetCode 4019: Merge Close Characters II

·1 分鐘· ·
LeetCode Medium Hash-Table String
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-09-13

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

每次都選 i 最小的相近配對,所以合併是從左邊開始穩定下來的:已經處理過、留下來的前綴裡不會有相近的配對,之後也不會再變。

所以由左到右建結果(String 模板一):

  • 記每種字元在結果裡最後的位置 last[ch]。
  • 新字元要放在結果的位置 len(res);如果 len(res) - last[ch] <= k,它會跟前面那個字元相近,被合併掉。
  • 否則放進結果,更新 last[ch]。

距離要用「結果裡的位置」算,因為題目的 index 是刪除後重新編號的。

我的嘗試
#

第一版想用原本的 index 減掉「最近被刪掉的個數」換算成目前的位置,用一個 deque 記視窗內刪掉的位置,但只扣了視窗內的刪除數,距離算錯。例如 "ccccca"、k = 1:所有的 c 都會併成一個,答案 "ca",這版回傳 "cca"。改成直接記結果裡的位置就 AC 了。

正確解法
#

class Solution:
    def mergeCharacters(self, s: str, k: int) -> str:
        last, res = {}, []
        for ch in s:
            if ch in last and len(res) - last[ch] <= k:
                continue                           # 跟前面的同字元相近,被合併
            last[ch] = len(res)
            res.append(ch)
        return "".join(res)

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • index 會在刪除後重新編號,距離要用結果裡的位置算。

面試口說整理
#

因為每次都合併 i 最小的配對,留下來的前綴不會再變。我由左到右建結果,記每種字元在結果裡最後的位置,新字元如果距離那個位置不超過 k 就被合併掉,否則放進結果。時間 O(n)。

相關文章

LeetCode 3713: Longest Balanced Substring I
·1 分鐘
LeetCode Medium Hash-Table String Counting Enumeration
LeetCode 3713 解題筆記:固定起點往右擴;「每種字元次數都一樣」等於「最大次數 × 種類數 = 長度」,每一步 O(1) 判斷
LeetCode 3900: Longest Balanced Substring After One Swap
·2 分鐘
LeetCode Medium Prefix-Sum Hash-Table String
LeetCode 3900 解題筆記:前綴差值相同就平衡;差 2 的子字串只要外面有可以換進來的字元也行,每個差值記最早的兩個位置就夠
LeetCode 3839: Number of Prefix Connected Groups
·1 分鐘
LeetCode Medium Hash-Table String Counting
LeetCode 3839 解題筆記:前 k 個字元相同的字互相連通,用 word[:k] 當 key 計數;長度不到 k 的字要排除
LeetCode 244: Shortest Word Distance II
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table String Array
LeetCode 244 解題筆記:預處理每個字的出現位置(天然排序),查詢時對兩個位置列表做雙指針合併,每次移動比較小的那個
LeetCode 3306: Count of Substrings Containing Every Vowel and K Consonants II
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table String
LeetCode 3306 解題筆記:「剛好 k 個子音」不單調;改成「五個母音都有且子音至少 k 個」減「至少 k + 1 個」,兩個都是「至少」型的計數視窗
LeetCode 1358: Number of Substrings Containing All Three Characters
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table String
LeetCode 1358 解題筆記:「至少各一個 a、b、c」的計數視窗:三種都有時一直縮左邊,count += left