根据字符出现频率排序

标签: 哈希表 字符串 桶排序 计数 排序 堆(优先队列)

难度: Medium

给定一个字符串 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 由大小写英文字母和数字组成

Submission

运行时间: 25 ms

内存: 16.7 MB

class Solution:
    def frequencySort(self, s: str) -> str:
        lst = [(i,s.count(i)) for i in set(s)]
        lst.sort(key = lambda x:x[1], reverse = True)
        res = [i[0]*i[1] for i in lst]
        return "".join(res)

Explain

这个题解采用了暴力的方法来解决问题。首先,使用一个列表推导式创建一个列表,其中包含每个唯一字符及其出现次数的元组。然后,根据字符出现的频率对这个列表进行降序排序。最后,使用另一个列表推导式根据每个字符的出现频率创建字符串,并将这些字符串连接起来得到最终结果。

时间复杂度: O(n^2 + m log m)

空间复杂度: O(m + n)

class Solution:
    def frequencySort(self, s: str) -> str:
        # 创建包含每个唯一字符及其出现次数的列表
        lst = [(i, s.count(i)) for i in set(s)]
        # 根据字符出现的频率降序排序
        lst.sort(key=lambda x: x[1], reverse=True)
        # 构造最终字符串
        res = [i[0] * i[1] for i in lst]
        return ''.join(res)