สมมติว่าเรามีสตริงที่ไม่ว่าง s และจำนวนเต็ม k; เราต้องจัดเรียงสตริงใหม่เพื่อให้อักขระเดียวกันอยู่ห่างจากกันอย่างน้อย k สตริงที่กำหนดเป็นอักษรตัวพิมพ์เล็ก หากไม่มีวิธีการจัดเรียงสตริงใหม่ เราจะทำสตริงว่าง
ดังนั้น หากอินพุตเป็น s ="aabbcc", k =3 เอาต์พุตจะเป็น "abcabc" เนื่องจากตัวอักษรเดียวกันอยู่ห่างจากกันอย่างน้อย 3 ตัว
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=สตริงว่าง
-
กำหนดหนึ่งแผนที่ m
-
n :=ขนาดของ s
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
(เพิ่ม m[s[i]] ขึ้น 1)
-
-
กำหนดลำดับความสำคัญหนึ่งคิว pq
-
สำหรับแต่ละคีย์-ค่าจับคู่ในหน่วย m ให้ทำ -
-
temp :=คู่กับคีย์และค่าของมัน
-
ใส่อุณหภูมิลงใน pq
-
(เพิ่มขึ้นอีก 1)
-
-
กำหนดหนึ่ง deque dq
-
ในขณะที่ (ไม่ใช่ pq ว่างเปล่า) ทำ -
-
curr :=ด้านบนของ pq
-
ลบองค์ประกอบออกจาก pq
-
ret :=ret + curr.first
-
(ลดสกุลเงินวินาทีลง 1)
-
ใส่ curr ที่ส่วนท้ายของ dq
-
ถ้าขนาดของ dq>=k แล้ว −
-
curr :=องค์ประกอบแรกของ dq
-
ลบองค์ประกอบด้านหน้าออกจาก dq
-
ถ้าcurr.second> 0 แล้ว −
-
ใส่เคอร์เนลลงใน pq
-
-
-
-
ในขณะที่ (ไม่ใช่ dq ว่างเปล่าและองค์ประกอบแรกของ dq เหมือนกับ 0) ทำ -
-
ลบองค์ประกอบด้านหน้าออกจาก dq
-
-
return (ถ้า dq ว่างเปล่า ให้ ret หรือสตริงว่าง)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
struct Comparator {
bool operator()(pair<char, int> a, pair<char, int> b) {
return !(a.second > b.second);
}
};
class Solution {
public:
string rearrangeString(string s, int k) {
string ret = "";
unordered_map<char, int> m;
int n = s.size();
for (int i = 0; i < n; i++) {
m[s[i]]++;
}
unordered_map<char, int>::iterator it = m.begin();
priority_queue<pair<char, int<, vector<pair<char, int>>,
Comparator> pq;
while (it != m.end()) {
pair<char, int> temp = {it->first, it->second};
pq.push(temp);
it++;
}
deque<pair<char, int>> dq;
while (!pq.empty()) {
pair<char, int> curr = pq.top();
pq.pop();
ret += curr.first;
curr.second--;
dq.push_back(curr);
// cout << ret << " " << dq.size() << endl;
if (dq.size() >= k) {
curr = dq.front();
dq.pop_front();
if (curr.second > 0)
pq.push(curr);
}
}
while (!dq.empty() && dq.front().second == 0)
dq.pop_front();
return dq.empty() ? ret : "";
}
};
main() {
Solution ob;
cout << (ob.rearrangeString("aabbcc", 3));
} อินพุต
"aabbcc", 3
ผลลัพธ์
bacbac