[leetcode-451-Sort Characters By Frequency]
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.
思路:
统计每一个字符出现频率,依次找出最大频率的字符等等。。
string frequencySort(string str) { vector<int>mp(256,0); for (auto c:str) { mp[c]++; } string s=""; int most = 0; int index = 0; for (int i = 0; i < 256;i++) { for (int j = 0; j < 256;j++) { if (mp[j] == 0)continue; if (most < mp[j]) { most = mp[j]; index = j; } } s.append(most, char(index)); mp[index] = 0; most = 0; } return s; }
还有一种就是利用桶排序的思路,一个字符出现次数最多也就字符串长度次。
将出现n次的字符都放在标号为n的bucket里,然后从后往前遍历即可。
string frequencySort(string s) { unordered_map<char,int> freq; vector<string> bucket(s.size()+1, ""); string res; //count frequency of each character for(char c:s) freq[c]++; //put character into frequency bucket for(auto& it:freq) { int n = it.second; char c = it.first; bucket[n].append(n, c); } //form descending sorted string for(int i=s.size(); i>0; i--) { if(!bucket[i].empty()) res.append(bucket[i]); } return res; }
参考:
https://discuss.leetcode.com/topic/66045/c-o-n-solution-without-sort