字母出现次数统计

163 阅读3分钟

问题分析

我们需要计算在给定字符串 s 中,至少出现 k 次的不同字符的数量。这个问题本质上是对字符串中每个字符出现频率的统计,并且过滤出那些频率大于或等于 k 的字符。

思路解析

  1. 字符频率统计:首先,我们需要统计字符串中每个字符的出现频率。我们可以使用哈希表(HashMap)来存储每个字符及其出现的次数。哈希表的键是字符,值是该字符的出现次数。

  2. 遍历并计数:遍历哈希表中的频率值,统计频率大于或等于 k 的字符的数量。

  3. 返回结果:最后,我们返回符合条件的字符的数量。

解法实现

我们可以按照以下步骤实现:

  • 创建一个 HashMap<Character, Integer> 用来统计每个字符的出现次数。
  • 遍历字符串,更新每个字符的频率。
  • 遍历 HashMap,统计出现频率大于等于 k 的字符数量。

代码详解

import java.util.HashMap;

public class Main {
    
    // 计算至少出现 k 次的字符的数量
    public static int solution(String s, int k) {
        // 创建一个 HashMap 来存储字符及其频率
        HashMap<Character, Integer> frequencyMap = new HashMap<>();
        
        // 遍历字符串,统计每个字符的频率
        for (char c : s.toCharArray()) {
            // 更新字符的频率
            frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
        }
        
        // 初始化符合条件的字符数量
        int count = 0;
        
        // 遍历 frequencyMap,统计符合条件的字符数量
        for (int freq : frequencyMap.values()) {
            if (freq >= k) {
                count++;
            }
        }
        
        // 返回符合条件的字符数量
        return count;
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution("aaabcd", 2) == 1);  // 输出 1
        System.out.println(solution("aacbcbdefghijklmnopqrstuvwxyz", 1) == 26);  // 输出 26
        System.out.println(solution("zzzzzzabc", 3) == 1);  // 输出 1
    }
}

代码详解

  1. HashMap<Character, Integer> frequencyMap: 用来存储每个字符及其对应的出现次数。
  2. s.toCharArray(): 将字符串 s 转换为字符数组,方便遍历每个字符。
  3. frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1): 对于每个字符 c,使用 getOrDefault 方法检查该字符是否已经存在于 frequencyMap 中。如果存在,更新它的出现次数;如果不存在,则默认频率为 0,并加 1。
  4. for (int freq : frequencyMap.values()): 遍历 frequencyMap 中所有字符的频率,统计那些频率大于或等于 k 的字符的数量。
  5. 返回值 count: 最后返回符合条件的字符数量。

复杂度分析

  • 时间复杂度

    • 遍历字符串 s 需要 O(n) 的时间,其中 n 是字符串的长度。
    • 遍历 frequencyMap 的所有值,最多是 26 次(因为字符串只有 26 个小写字母),所以这个步骤的时间复杂度是 O(1)。

    综合起来,时间复杂度是 O(n),其中 n 是字符串的长度。

  • 空间复杂度

    • 使用了一个 HashMap 来存储字符的频率,最多会存储 26 个不同的字符。因此,空间复杂度是 O(1),因为字符集大小是固定的(小写字母的数量是固定的)。

样例分析

样例 1:

输入:

s = "aaabcd", k = 2
  • 字符频率:a: 3, b: 1, c: 1, d: 1
  • 至少出现 2 次的字符是 a,所以输出 1。

样例 2:

输入:

s = "aacbcbdefghijklmnopqrstuvwxyz", k = 1
  • 字符频率:每个字母都出现了 1 次。
  • 至少出现 1 次的字符是所有字母(26 个字母),所以输出 26。

样例 3:

输入:

s = "zzzzzzabc", k = 3
  • 字符频率:z: 6, a: 1, b: 1, c: 1
  • 至少出现 3 次的字符是 z,所以输出 1。

总结

  • 通过使用 HashMap 来统计字符频率,我们能够高效地处理这个问题。
  • 时间复杂度为 O(n),空间复杂度为 O(1),因此该解法是非常高效的。
  • 样例验证了该方法可以正确处理不同的输入情况。