排序字符频率
字数 778 2025-10-27 22:20:33
排序字符频率
题目描述
给定一个字符串 s,请将字符串中的字符按照出现频率降序排列。如果有多个字符出现频率相同,则按字符的原始顺序排列(注意:某些编程语言中可能无法直接保持非稳定排序的原始顺序,需特殊处理)。例如,输入 "tree" 应返回 "eert" 或 "eetr"(若要求稳定排序则需额外处理)。
解题步骤
-
统计字符频率
- 遍历字符串,使用哈希表(如 Python 的
defaultdict或Counter)记录每个字符出现的次数。 - 示例:
s = "tree"→ 统计结果:{'t': 1, 'r': 1, 'e': 2}。
- 遍历字符串,使用哈希表(如 Python 的
-
按频率分组
- 创建另一个哈希表(或列表),以频率为键,对应字符列表为值。注意:相同频率的字符需按首次出现的顺序存储(若需稳定排序)。
- 示例:频率分组:
{2: ['e'], 1: ['t', 'r']}(顺序与原字符串中一致)。
-
按频率降序处理
- 确定最大频率值(如
max_freq = 2),从最高频率到最低频率遍历。 - 对于每个频率,按顺序取出字符,重复该字符频率次数的字符并拼接。
- 示例:
- 频率 2:
'e'→"ee" - 频率 1:
't', 'r'→"t" + "r" = "tr" - 结果:
"ee" + "tr" = "eetr"
- 频率 2:
- 确定最大频率值(如
-
处理稳定性(关键点)
- 若语言内置排序不稳定(如 Python 的
sorted默认稳定,但需显式指定),需在分组时保留原始顺序。 - 替代方法:使用桶排序,以频率为桶索引,桶内保持字符顺序。
- 若语言内置排序不稳定(如 Python 的
示例代码(Python)
from collections import Counter
def frequencySort(s: str) -> str:
# 统计频率
freq_map = Counter(s)
# 分组:按频率降序,同频率按原顺序
max_freq = max(freq_map.values())
buckets = [[] for _ in range(max_freq + 1)]
for char in s: # 按原顺序遍历以保持稳定性
f = freq_map[char]
if char not in buckets[f]:
buckets[f].append(char)
# 从高频率到低频率拼接结果
result = []
for i in range(max_freq, 0, -1):
for char in buckets[i]:
result.append(char * i)
return ''.join(result)
复杂度分析
- 时间复杂度:O(n)(遍历统计 + 桶排序处理)。
- 空间复杂度:O(n)(哈希表和桶存储)。
关键思路
通过桶排序保持相同频率字符的原始顺序,避免使用不稳定的通用排序算法直接对字符排序。