โจทย์
กำหนดสตริง s และจำนวน k ลบกลุ่มตัวอักษรเดียวกันที่ติดกัน k ตัวซ้ำๆ จนไม่สามารถลบได้แล้ว คืนสตริงสุดท้าย
ตัวอย่าง: s="deeedbbcccbdaa", k=3 → ลบ "eee","ccc" → "ddbbbdaa" → ลบ "bbb" → "dddaa" → ลบ "ddd" → "aa"
แนวคิด: Stack เก็บ (ตัวอักษร, จำนวนติดต่อกัน)
อ่านซ้ายไปขวา เก็บคู่ (char, count) ใน stack ถ้า count == k → pop ออก
ขั้นตอน
- สร้าง
stack<pair<char,int>> st - ลูป
i = 0 ถึง n(รวม n เพื่อ flush stack ท้ายสุด):- ถ้า
!st.empty() && st.top().second == k→st.pop() - ถ้า
i == n→ break - ถ้า
st.empty() || st.top().first != s[i]→st.push({s[i], 1}) - มิฉะนั้น →
st.top().second++
- ถ้า
- สร้างผลลัพธ์จาก stack (ต้อง reverse เพราะ stack เป็น LIFO)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string removeDuplicates(string s, int k) {
string ans;
stack<pair<char, int>> st;
int n = s.size();
for (int i = 0; i <= n; ) {
if (!st.empty() && st.top().second == k) st.pop();
if (i == n) break;
char c = s[i];
if (st.empty() || st.top().first != c) {
st.push({c, 1});
} else {
st.top().second++;
}
i++;
}
while (!st.empty()) {
auto [c, cnt] = st.top(); st.pop();
ans.append(cnt, c);
}
reverse(ans.begin(), ans.end());
return ans;
}
};
int main() {
Solution ob;
cout << ob.removeDuplicates("deeedbbcccbdaa", 3); // aa
return 0;
}
อินพุต / เอาต์พุต
Input: "deeedbbcccbdaa" 3
Output: aa
ความซับซ้อน
- Time: O(n) - แต่ละตัวอักษร push/pop สูงสุด 1 ครั้ง
- Space: O(n) - stack