451. Sort Characters By Frequency 按出现频率排序字符

451. Sort Characters By Frequency 按出现频率排序字符

桶排序的思想

时间复杂度:O(n)

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

	// 以频率为下标将字符放置入桶中
    vector<vector<int> > b(s.size()+1); 
    for(const auto &pair : m)
        b[pair.second].push_back(pair.first);

	// 从后向前,从频率高的字符开始放入结果集
    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();
}

原地排序

直接统计字符出现频率,排序的时候查表来排即可 时间复杂度:nlogn

收获

  • stl 中的 stringstream 可以当做类似 stringbuilder 来使用来一步步构造出目标字符串

#桶 #字符串