LeetCode 451.根据字符出现频率排序

题目描述:

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

  • 输入:
  • “tree”
  • 输出:
  • “eert”
  • 解释:
  • 'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。

示例 2:

  • 输入:
  • “cccaaa”
  • 输出:
  • “cccaaa”
  • 解释:
  • 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:

  • 输入:
  • “Aabb”
  • 输出:
  • “bbAa”
  • 解释:
  • 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意’A’和’a’被认为是两种不同的字符。
代码:
class Solution {
public:
    string frequencySort(string s) {
        string str = "";
        // 创建一个无序map记录字符串中各字符出现次数
        unordered_map<char,int> bucket;
        for(const auto &t: s){
            ++bucket[t];
        }
        unordered_map<char,int>::iterator quick,slow;

        // 选择排序
        for(slow = bucket.begin(); slow != bucket.end(); ++slow){
            int max = 0;
            char Char;
            // 找出当前出现频率最高的子串
            for(quick =bucket.begin();quick != bucket.end(); ++quick){
                if(quick->second > max){
                    max = quick->second;
                    Char = quick->first;
                }
            }
            // 打印出当前最长的子串
            for(int i = 0; i < max; ++i){
                str += Char;
            }
            // bucket.erase(Char);  会发生错误,(错误原因:堆在释放后使用)
            bucket[Char] = 0;
        }
        return str;
    }
};

你可能感兴趣的:(算法,算法,leetcode)