字母出现次数统计
问题描述
小R得到了一个由小写字母组成的字符串 s,她想知道有多少个小写字母在字符串中至少出现了 k 次。请你帮她解决这个问题。
测试样例
样例1:
输入:
s = "aaabcd", k = 2
输出:1
样例2:
输入:
s = "aacbcbdefghijklmnopqrstuvwxyz", k = 1
输出:26
样例3:
输入:
s = "zzzzzzabc", k = 3
输出:1
思路解析
- 统计字符频率:首先,你需要统计字符串
s中每个字符出现的频率。你可以使用collections.Counter来实现这一点。 - 筛选符合条件的字符:接下来,你需要筛选出那些出现频率至少为
k次的字符。 - 计算符合条件的字符数量:最后,统计符合条件的字符数量并返回结果。
解题代码
from collections import Counter
def solution(s: str, k: int) -> int:
# 统计字符频率
char_count = Counter(s)
# 筛选符合条件的字符
# 计算符合条件的字符数量
result = sum(1 for count in char_count.values() if count >= k)
return result
复杂度分析
时间复杂度分析
-
统计字符频率:
- 使用
Counter(s)来统计字符频率。Counter的内部实现通常是遍历字符串s一次,因此这一步的时间复杂度是O(n),其中n是字符串s的长度。
- 使用
-
筛选符合条件的字符:
- 使用
sum(1 for count in char_count.values() if count >= k)来筛选符合条件的字符。这一步需要遍历char_count中的所有键值对,但由于char_count中的键值对数量最多为 26(因为只有 26 个小写字母),所以这一步的时间复杂度是O(1)。
- 使用
综上所述,整个算法的时间复杂度是 O(n),其中 n 是字符串 s 的长度。
空间复杂度分析
-
统计字符频率:
Counter(s)会创建一个字典来存储每个字符的频率。这个字典最多会有 26 个键值对(因为只有 26 个小写字母),因此这一步的空间复杂度是O(1)。
-
其他变量:
- 除了
char_count之外,代码中没有使用额外的空间,因此空间复杂度主要由char_count决定。
- 除了
综上所述,整个算法的空间复杂度是 O(1)。
总结
- 时间复杂度:
O(n),其中n是字符串s的长度。 - 空间复杂度:
O(1)。
总结与思考
- 使用Counter统计频率。
- 筛选频率大于等于
k的字符。 - 统计符合条件的字符数量。