3853. Merge Close Characters

練習日期:2026-02-28

難度:Medium

類型:Hash Table、String、Biweekly Contest 177

📘 題目敘述

給你字串 s 與整數 k,若兩個相同字元距離不超過 k 就可合併,重複操作到不能再合併,回傳最終字串。

條件限制

  • 1 <= s.length <= 100
  • 1 <= k <= s.length
  • s 只包含小寫英文字母

🧠 解題思路

使用長度最多為 k 的滑動視窗來模擬。queue 保存最近保留下來的字元,set 快速判斷新字元是否已在視窗內。若在視窗內則被合併(略過),不在就保留。

所有變數

  • q:最近保留的字元(最多 k 個)
  • ss:視窗內字元集合
  • ans:答案字串

🪜 主要流程步驟

1. 初始化

建立空視窗與答案字串。


2. 逐字處理

若字元已在 ss 中則略過;否則加入答案。


3. 視窗滿時移除最舊

q.size()==k 且要加入新字元時,先移除最舊字元。


4. 視窗未滿直接加入

未滿時可直接 push / insert。


5. 回傳答案

掃完後回傳 ans

⏱️ 複雜度

  • 時間複雜度:O(n log k)
  • 空間複雜度:O(k)

💻 程式碼實作

class Solution {
public:
    string mergeCharacters(string s, int k) {
        queue<char> q;
        set<char> ss;
        string ans = "";
        for (char a : s) {
            if (q.size() == k) {
                if (!ss.count(a)) {
                    ss.erase(q.front());
                    q.pop();
                    q.push(a);
                    ss.insert(a);
                    ans += a;
                }
            }
            if (q.size() < k && !ss.count(a)) {
                q.push(a);
                ss.insert(a);
                ans += a;
            }
        }
        return ans;
    }
};

https://leetcode.com/problems/merge-close-characters/

作者:scottnick
撰寫日期:2026-02-28
類別:
原文連結:https://scottnick.github.io/cpp-notes/all%20problems/3853-merge-close-characters.html