首页 > 代码库 > [leetcode-451-Sort Characters By Frequency]

[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

 

 

[leetcode-451-Sort Characters By Frequency]