Cho chuỗi s và số nguyên k. Lặp lại việc xóa k ký tự giống nhau liên tiếp cho đến khi không thể xóa thêm. Trả về chuỗi cuối cùng.
Ví dụ: s = "deeedbbcccbdaa", k = 3 → xóa "eee", "ccc" → "ddbbbaa" → xóa "bbb" → "dddaa" → xóa "ddd" → "aa".
Thuật toán giải quyết (Stack cặp ký tự-số lượng)
- Stack lưu cặp
(char, count). - Duyệt chuỗi:
- Nếu stack rỗng hoặc ký tự khác đỉnh stack → push
(c, 1). - Ngược lại → tăng count đỉnh stack.
- Nếu count đạt
k→ pop.
- Nếu stack rỗng hoặc ký tự khác đỉnh stack → push
- Xây dựng kết quả từ stack (đảo ngược vì stack LIFO).
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string removeDuplicates(string s, int k) {
vector<pair<char, int>> st;
for (char c : s) {
if (!st.empty() && st.back().first == c) {
st.back().second++;
if (st.back().second == k) st.pop_back();
} else {
st.push_back({c, 1});
}
}
string ans;
for (auto &p : st) ans.append(p.second, p.first);
return ans;
}
};
int main() {
Solution ob;
cout << ob.removeDuplicates("deeedbbcccbdaa", 3);
}
Đầu vào
"deeedbbcccbdaa" 3
Đầu ra
aa