[leetcode-451-Sort Characters By Frequency]
阿新 • • 發佈:2017-07-06
eas log esc mos pla aaa interview with quest
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
[leetcode-451-Sort Characters By Frequency]