Sort Characters by Frequency

Sort Characters by Frequency

Bucket Sort Approach

Time complexity: O(n)

string frequencySort(string s) {
    if (s.empty()) return s;
    // Count frequencies
    unordered_map<int, int> m;
    for(auto c : s)
        ++m[c];

    // Place characters into buckets indexed by frequency
    vector<vector<int> > b(s.size()+1); 
    for(const auto &pair : m)
        b[pair.second].push_back(pair.first);

    // Start from highest frequency and build result
    stringstream res;
    for(int i=b.size()-1;i>=0;--i) {
        for(char c : b[i]) {
            for(int j=0;j<i;++j)
                res<<c;
        }
    }

    return res.str();
}

In-place Sorting

Count character frequencies directly. Sort using the frequency table. Time complexity: n log n

Key Takeaway

  • STL’s stringstream works like StringBuilder for building target strings step by step

#bucket #string