สมมติว่าเรามีสตริง เราต้องจัดเรียงอักขระตามความถี่ ดังนั้นหากสตริงเป็นเหมือน “abbbacbcc” ผลลัพธ์จะเป็น “bbbbcccaa”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างอาร์เรย์ของคู่ที่เรียกว่า v สร้างหนึ่งแผนที่ m
- สำหรับอักขระทั้งหมดในสตริง
- เพิ่มค่าของ m[character] ขึ้น 1
- i :=องค์ประกอบแรกของแผนที่
- ในขณะที่แผนที่มีองค์ประกอบ
- แทรก (i.second, i.first) ลงใน v
- และเพิ่ม i เพื่อชี้ไปที่องค์ประกอบถัดไป
- เรียงลำดับเวกเตอร์ v
- ans :=สตริงว่าง
- สำหรับ i :=0 ถึงขนาดของ v
- t :=องค์ประกอบแรกของ v[i]
- ในขณะที่ t ไม่ใช่ 0
- ans :=ans + ส่วนที่สองของ v[i]
- ลด t ขึ้น 1
- คืนสินค้า
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(pair <int, char> a, pair <int, char> b){
return a.first < b.first;
}
string frequencySort(string s) {
vector < pair <int, char> > v;
map <char, int> m;
for(int i = 0; i < s.size(); i++){
m[s[i]]++;
}
map <char, int> :: iterator i = m.begin();
while(i != m.end()){
v.push_back({i->second, i->first});
i++;
}
sort(v.rbegin(), v.rend(), cmp);
string ans = "";
for(int i = 0; i < v.size(); i++){
int t = v[i].first;
while(t--)ans += v[i].second;
}
return ans;
}
};
main(){
Solution ob;
cout << ob.frequencySort("abbbacbcc");
} อินพุต
"abbbacbcc"
ผลลัพธ์
bbbbcccaa