Cho chuỗi S, sắp xếp lại các ký tự sao cho không có 2 ký tự giống nhau liền kề. Trả về chuỗi hợp lệ bất kỳ hoặc chuỗi rỗng nếu không thể.
Ví dụ: "AAB" → "ABA".
Thuật toán giải quyết (Heap ưu tiên theo tần suất)
- Đếm tần suất ký tự, đẩy vào max-heap (priority_queue) theo tần suất.
- Lặp khi heap chưa rỗng:
- Lấy 2 phần tử tần suất cao nhất
one,two. - Thêm ký tự của chúng vào kết quả.
- Giảm tần suất, nếu còn > 0 → đẩy lại heap.
- Lấy 2 phần tử tần suất cao nhất
- Nếu heap còn 1 phần tử với tần suất > 1 → không thể sắp xếp → trả về rỗng.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string reorganizeString(string S) {
unordered_map<char, int> freq;
for (char c : S) freq[c]++;
priority_queue<pair<int, char>> pq;
for (auto &p : freq) pq.push({p.second, p.first});
string ans;
while (!pq.empty()) {
auto one = pq.top(); pq.pop();
if (pq.empty()) {
if (one.first > 1) return "";
ans += one.second;
return ans;
}
auto two = pq.top(); pq.pop();
ans += one.second;
ans += two.second;
if (--one.first > 0) pq.push(one);
if (--two.first > 0) pq.push(two);
}
return ans;
}
};
int main() {
Solution ob;
cout << ob.reorganizeString("AAB");
}
Đầu vào
S = "AAB"
Đầu ra
ABA