📘 題目敘述
給你字串 s 與整數
k,若兩個相同字元距離不超過
k 就可合併,重複操作到不能再合併,回傳最終字串。
條件限制
1 <= s.length <= 1001 <= k <= s.lengths只包含小寫英文字母
🧠 解題思路
使用長度最多為 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;
}
};