问题分析
我们需要计算在给定字符串 s 中,至少出现 k 次的不同字符的数量。这个问题本质上是对字符串中每个字符出现频率的统计,并且过滤出那些频率大于或等于 k 的字符。
思路解析
-
字符频率统计:首先,我们需要统计字符串中每个字符的出现频率。我们可以使用哈希表(
HashMap)来存储每个字符及其出现的次数。哈希表的键是字符,值是该字符的出现次数。 -
遍历并计数:遍历哈希表中的频率值,统计频率大于或等于
k的字符的数量。 -
返回结果:最后,我们返回符合条件的字符的数量。
解法实现
我们可以按照以下步骤实现:
- 创建一个
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
}
}
代码详解
HashMap<Character, Integer> frequencyMap: 用来存储每个字符及其对应的出现次数。s.toCharArray(): 将字符串s转换为字符数组,方便遍历每个字符。frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1): 对于每个字符c,使用getOrDefault方法检查该字符是否已经存在于frequencyMap中。如果存在,更新它的出现次数;如果不存在,则默认频率为 0,并加 1。for (int freq : frequencyMap.values()): 遍历frequencyMap中所有字符的频率,统计那些频率大于或等于k的字符的数量。- 返回值
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),因此该解法是非常高效的。
- 样例验证了该方法可以正确处理不同的输入情况。