1. 程式人生 > 其它 >【力扣 076】451. 根據字元出現頻率排序

【力扣 076】451. 根據字元出現頻率排序

451. 根據字元出現頻率排序

給定一個字串 s ,根據字元出現的 頻率 對其進行 降序排序 。一個字元出現的 頻率 是它出現在字串中的次數。

返回 已排序的字串 。如果有多個答案,返回其中任何一個。

示例 1:

輸入: s = "tree"
輸出: "eert"
解釋: 'e'出現兩次,'r'和't'都只出現一次。
因此'e'必須出現在'r'和't'之前。此外,"eetr"也是一個有效的答案。
示例 2:

輸入: s = "cccaaa"
輸出: "cccaaa"
解釋: 'c'和'a'都出現三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正確的,因為相同的字母必須放在一起。
示例 3:

輸入: s = "Aabb"
輸出: "bbAa"
解釋: 此外,"bbaA"也是一個有效的答案,但"Aabb"是不正確的。
注意'A'和'a'被認為是兩種不同的字元。
 

提示:

1 <= s.length <= 5 * 105
s 由大小寫英文字母和數字組成

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/sort-characters-by-frequency
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

程式碼實現:

方法一: 優先佇列

程式碼實現:

class Solution {
public:
  string frequencySort(string s)
  {
    unordered_map<char, int> s_map;
    for (char c : s)
      s_map[c]++;

    auto cmp = [](pair<char, int> &lhs, pair<char, int> &rhs)
    { return lhs.second < rhs.second; };
    priority_queue<pair<char, int>, vector<pair<char, int>>, decltype(cmp)> qu(cmp);

    for (auto &[key, val] : s_map)
      qu.emplace(key, val);

    string res;
    while (!qu.empty())
    {
      for (int i = 0; i < qu.top().second; ++i)
      {
        res.push_back(qu.top().first);
      }
      qu.pop();
    }
    return res;
  }
};