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.
// Hashmap + Bucket sort
string frequencySort(string s) { // time: O(n); space: O(n)
    unordered_map<char, int> m;
    vector<string> bucket(s.length() + 1, "");
    string res;
    for (char c : s) ++m[c];
    for (auto a : m) {
        bucket[a.second].append(a.second, a.first);
    }
    for (int i = s.length(); i > 0; --i) {
        if (!bucket[i].empty()) {
            res.append(bucket[i]);
        }
    }
    return res;
}
// Bucket Sort
string frequencySort(string s) { // time: O(nlogn); space: O(1)
    vector<int> bucket(256, 0);
    for (char c : s) ++ bucket[c];
    sort(s.begin(), s.end(), [&bucket](char& a, char& b) {
        return bucket[a] > bucket[b] || (bucket[a] == bucket[b] && a < b);
    });
    return s;
}

Last updated

Was this helpful?