一、题目

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:
"tree"

输出:
"eert"

解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

示例 2:

输入:
"cccaaa"

输出:
"cccaaa"

解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。

二、思路
  • 使用桶排序的思想,统计出现次数最多的字符出现的次数,然后通过最大次数创建桶,每个桶里面放出现相应 次数的字符,最后倒叙遍历。
  • 也可以使用堆按照出现次数进行排序,然后再出堆。
三、代码

class Solution {
public:
string frequencySort(string s) {
unordered_map<char, int> mp;
string ans;
int max_size = 0;
for (auto& c: s) {
max_size = max(max_size, ++mp[c]);
}
vector<vector<char>> buckets(max_size + 1);
for (auto& [c, cnt]: mp) {
buckets[cnt].push_back(c);
}
for (int i = max_size; i >= 1; i--) {
for (auto& c: buckets[i]) {
for (int j = 0; j < i; j++) ans.push_back(c);
}
}
return ans;
}
};