1. 程式人生 > >[leetcode-451-Sort Characters By Frequency]

[leetcode-451-Sort Characters By Frequency]

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]