解决字符频率问题:使用Java实现
在日常的编程挑战中,我们经常遇到需要处理字符串和统计特定条件下的字符出现次数的问题。本文将介绍一个具体的例子,其中我们需要找出在一个给定的字符串中至少出现了 k 次的不同字符的数量。
问题描述
给定一个字符串 s 和一个整数 k,我们的任务是找到字符串 s 中至少出现 k 次的所有不同字符的数量。例如,如果输入字符串为 "aaabcd" 并且 k 为 2,那么输出应该是 1,因为只有字符 'a' 出现了至少两次。
解决方案分析
要解决这个问题,我们可以采用以下步骤:
- 统计字符频率:首先遍历整个字符串,记录每个字符出现的次数。
- 过滤符合条件的字符:然后,我们检查每个字符的出现次数是否大于或等于
k。 - 计算结果:最后,我们计数满足条件的字符数量并返回这个值。
Java 实现
下面是一个完整的 Java 程序,用于解决上述问题:
import java.util.HashMap;
import java.util.Map;
public class CharacterFrequency {
/**
* 计算字符串 s 中至少出现 k 次的不同字符数量。
*
* @param s 输入字符串
* @param k 字符至少出现的次数
* @return 至少出现 k 次的不同字符数量
*/
public static int solution(String s, int k) {
// 创建哈希表存储字符及其出现次数
Map<Character, Integer> charCountMap = new HashMap<>();
// 遍历字符串,更新每个字符的计数
for (char c : s.toCharArray()) {
charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1);
}
// 统计至少出现 k 次的字符数量
int count = 0;
for (int value : charCountMap.values()) {
if (value >= k) {
count++;
}
}
return count;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution("aaabcd", 2)); // 应输出 1
System.out.println(solution("aacbcbdefghijklmnopqrstuvwxyz", 1)); // 应输出 26
System.out.println(solution("zzzzzzabc", 3)); // 应输出 1
}
}
代码解释
- HashMap 的使用:这里我们利用
HashMap来存储每个字符及其对应的出现次数。getOrDefault方法用来获取键对应的值,如果键不存在,则返回默认值(这里是 0)。 - 遍历字符串:通过
for-each循环遍历字符串中的每个字符,并更新HashMap中的计数。 - 计算结果:再次遍历
HashMap,这次是为了检查哪些字符的出现次数大于或等于k,并对这些字符进行计数。
性能考虑
该算法的时间复杂度主要取决于字符串长度 n,因为我们只需要一次遍历来构建 HashMap,然后再遍历 HashMap 来计算结果。因此,时间复杂度为 O(n),空间复杂度也是 O(n),因为最坏情况下 HashMap 可能会存储所有不同的字符。
结论
通过上面的方法,我们可以有效地解决这类字符频率问题。这种技术不仅适用于这个问题,而且可以作为处理字符串统计问题的一种通用方法。