451. Sort Characters By Frequency

451. Sort Characters By Frequency

Description

Difficulty: Medium

Related Topics: Hash Table, String, Sorting, Heap (Priority Queue), Bucket Sort, Counting

Given a string s, sort it in decreasing order based on the frequency of the characters. The frequency of a character is the number of times it appears in the string.

Return the sorted string. If there are multiple answers, return any of them.

Example 1:

1
2
3
4
Input: s = "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:

1
2
3
4
Input: s = "cccaaa"
Output: "aaaccc"
Explanation: Both 'c' and 'a' appear three times, so both "cccaaa" and "aaaccc" are valid answers.
Note that "cacaca" is incorrect, as the same characters must be together.

Example 3:

1
2
3
4
Input: s = "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.

Constraints:

  • 1 <= s.length <= 5 * 105
  • s consists of uppercase and lowercase English letters and digits.

Hints/Notes

  • priority queue

Solution

Language: C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
    string frequencySort(string s) {
        map<intint> m;
        for (char c : s) {
            m[c - 'a']++;
        }
        priority_queue<vector<int>, vector<vector<int>>, less<vector<int>>> pq;
        for (auto it : m) {
            int c = it.first;
            int f = it.second;
            pq.push({f, c});
        }
        string res;
        while (!pq.empty()) {
            auto top = pq.top();
            pq.pop();
            char c = top[1] + 'a';
            int f = top[0];
            for (int i = 0; i < f; i++) {
                res += c;
            }
        }
        return res;
    }
};