一、题目
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 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;
}
};