派派的刷题之旅(三) | 豆包MarsCode AI 刷题

41 阅读2分钟

字母出现次数统计

问题描述

小R得到了一个由小写字母组成的字符串 s,她想知道有多少个小写字母在字符串中至少出现了 k 次。请你帮她解决这个问题。

测试样例

样例1:

输入:s = "aaabcd", k = 2
输出:1

样例2:

输入:s = "aacbcbdefghijklmnopqrstuvwxyz", k = 1
输出:26

样例3:

输入:s = "zzzzzzabc", k = 3
输出:1

思路解析

  1. 统计字符频率:首先,你需要统计字符串 s 中每个字符出现的频率。你可以使用 collections.Counter 来实现这一点。
  2. 筛选符合条件的字符:接下来,你需要筛选出那些出现频率至少为 k 次的字符。
  3. 计算符合条件的字符数量:最后,统计符合条件的字符数量并返回结果。

解题代码

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

复杂度分析

时间复杂度分析
  1. 统计字符频率

    • 使用 Counter(s) 来统计字符频率。Counter 的内部实现通常是遍历字符串 s 一次,因此这一步的时间复杂度是 O(n),其中 n 是字符串 s 的长度。
  2. 筛选符合条件的字符

    • 使用 sum(1 for count in char_count.values() if count >= k) 来筛选符合条件的字符。这一步需要遍历 char_count 中的所有键值对,但由于 char_count 中的键值对数量最多为 26(因为只有 26 个小写字母),所以这一步的时间复杂度是 O(1)

综上所述,整个算法的时间复杂度是 O(n),其中 n 是字符串 s 的长度。

空间复杂度分析
  1. 统计字符频率

    • Counter(s) 会创建一个字典来存储每个字符的频率。这个字典最多会有 26 个键值对(因为只有 26 个小写字母),因此这一步的空间复杂度是 O(1)
  2. 其他变量

    • 除了 char_count 之外,代码中没有使用额外的空间,因此空间复杂度主要由 char_count 决定。

综上所述,整个算法的空间复杂度是 O(1)

总结
  • 时间复杂度O(n),其中 n 是字符串 s 的长度。
  • 空间复杂度O(1)

总结与思考

  • 使用Counter统计频率。
  • 筛选频率大于等于 k 的字符。
  • 统计符合条件的字符数量。