Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input:
"tree"
Output:
"eert"
Explanation:
'e' appears twice while 'r' and 't' both appear once.
So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer.
Example 2:
Input:
"cccaaa"
Output:
"cccaaa"
Explanation:
Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer.
Note that "cacaca" is incorrect, as the same characters must be together.
Example 3:
Input:
"Aabb"
Output:
"bbAa"
Explanation:
"bbaA" is also a valid answer, but "Aabb" is incorrect.
Note that 'A' and 'a' are treated as two different characters.
// Hashmap + Bucket sort
string frequencySort(string s) { // time: O(n); space: O(n)
unordered_map<char, int> m;
vector<string> bucket(s.length() + 1, "");
string res;
for (char c : s) ++m[c];
for (auto a : m) {
bucket[a.second].append(a.second, a.first);
}
for (int i = s.length(); i > 0; --i) {
if (!bucket[i].empty()) {
res.append(bucket[i]);
}
}
return res;
}
// Bucket Sort
string frequencySort(string s) { // time: O(nlogn); space: O(1)
vector<int> bucket(256, 0);
for (char c : s) ++ bucket[c];
sort(s.begin(), s.end(), [&bucket](char& a, char& b) {
return bucket[a] > bucket[b] || (bucket[a] == bucket[b] && a < b);
});
return s;
}