สมมติว่าเรามีสตริง S ให้ตรวจสอบว่าสามารถจัดเรียงตัวอักษรใหม่ได้หรือไม่เพื่อให้อักขระสองตัวที่อยู่ติดกันไม่เหมือนกัน ถ้าเป็นไปได้ ให้แสดงผลใดๆ ที่เป็นไปได้ หากไม่สามารถทำได้ ให้ส่งคืนสตริงว่าง ดังนั้นหากอินพุตเป็นเหมือน “AAB” เอาต์พุตจะเป็น “ABA”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างคิวลำดับความสำคัญของคู่อักขระจำนวนเต็มที่เรียกว่า pq กำหนดหนึ่งแผนที่ m
- n :=ขนาดของสตริง
- เก็บความถี่ของอักขระในแผนที่ m
- สำหรับคู่คีย์-ค่าแต่ละคู่ p ในหน่วย m
- แทรก (ส่วนจำนวนเต็มของ p ส่วนอักขระของ p)
- ans :=สตริงว่าง
- ในขณะที่ pq ไม่ว่างเปล่า
- ตั้งค่าหนึ่ง :=คู่บนจาก pq และลบคู่บนสุดจาก pq
- ถ้า pq ว่างเปล่า
- ถ้าเป็นจำนวนเต็มของหนึ่ง> 1 ให้คืนค่าสตริงว่าง
- ans :=ans + ส่วนของตัวละครหนึ่งตัว
- คืนสินค้า
- สอง :=คู่บนจาก pq และลบคู่บนสุดจาก pq
- ans :=ans + ส่วนของตัวละครหนึ่งตัว
- ans :=ans + ส่วนของอักขระสองตัว
- เพิ่มส่วนจำนวนเต็มของหนึ่งและสองขึ้น 1
- ถ้าส่วนจำนวนเต็มของตัวใดตัวหนึ่งไม่ใช่ 0 ให้แทรกส่วนใดส่วนหนึ่งลงใน pq
- หากส่วนจำนวนเต็มของสองส่วนไม่ใช่ 0 ให้แทรกส่วนหนึ่งลงใน pq
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string reorganizeString(string S) {
priority_queue <pair <int, char>> pq;
map <char, int> m;
int n = S.size();
for(int i = 0; i < n; i++){
m[S[i]]++;
}
map <char, int> :: iterator i = m.begin();
while(i != m.end()){
pq.push({i->second, i->first});
i++;
}
string ans = "";
while(!pq.empty()){
pair <int, char> one = pq.top();
pq.pop();
if(pq.empty()){
if(one.first > 1)
return "";
ans += one.second;
return ans;
}
pair <int, char> two = pq.top();
pq.pop();
ans += one.second;
ans += two.second;
//cout << ans << endl;
one.first--;
two.first--;
if(one.first)pq.push(one);
if(two.first)pq.push(two);
}
return ans;
}
};
int main() {
Solution ob1;
cout << ob1.reorganizeString("AAB") << endl;
return 0;
} อินพุต
S = "AAB"
ob1.reorganizeString("AAB") ผลลัพธ์
ABA