字符串中小写字母出现次数的统计问题解析
在编程中,字符串处理是一个常见且重要的任务。有时候,我们需要对字符串中的字符进行计数,以了解某些字符或字符组的出现频率。在这个问题中,我们需要统计一个字符串中至少出现 k 次的小写字母的数量。这个问题看似简单,但却涉及到了字符串遍历、字符计数和条件判断等基本概念。下面,我们将详细解析这个问题,并提供一种有效的解决方案。
问题描述
给定一个由小写字母组成的字符串 s 和一个整数 k,我们需要计算字符串 s 中至少出现 k 次的小写字母的数量。
测试样例
-
输入:
s = "aaabcd", k = 2输出:1解释:在这个字符串中,只有字符
'a'出现了 3 次,满足条件。 -
输入:
s = "aacbcbdefghijklmnopqrstuvwxyz", k = 1输出:26解释:每个字母都至少出现了 1 次,所以所有 26 个小写字母都满足条件。
-
输入:
s = "zzzzzzabc", k = 3输出:1解释:在这个字符串中,只有字符
'z'出现了 6 次,满足条件。
解决方案
为了解决这个问题,我们可以采用以下步骤:
-
初始化一个数组:用于记录每个小写字母的出现次数。由于小写字母有 26 个,我们可以使用一个长度为 26 的整数数组
letterCounts。 -
遍历字符串:对于字符串中的每个字符,将其转换为对应的索引(
'a'对应索引 0,'b'对应索引 1,依此类推),并在letterCounts数组中相应的位置上加 1。 -
统计满足条件的字符数量:遍历
letterCounts数组,统计那些出现次数不少于k次的字母的数量。
实现代码
下面是上述步骤的具体实现代码:
public class Main {
public static int solution(String s, int k) {
// 使用一个数组来记录每个字母的出现次数
int[] letterCounts = new int[26];
// 统计每个字母的出现次数
for (char c : s.toCharArray()) {
letterCounts[c - 'a']++;
}
// 统计出现次数不少于 k 次的字母数量
int count = 0;
for (int freq : letterCounts) {
if (freq >= 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);
}
}
代码解析
-
初始化数组:
int[] letterCounts = new int[26];这里,我们创建了一个长度为 26 的数组,用于存储每个小写字母的出现次数。
-
遍历字符串:
for (char c : s.toCharArray()) { letterCounts[c - 'a']++; }我们将字符串转换为字符数组,然后遍历每个字符。通过
c - 'a'将字符转换为对应的索引(0 到 25),并在数组中相应的位置上加 1。 -
统计满足条件的字符数量:
int count = 0; for (int freq : letterCounts) { if (freq >= k) { count++; } }我们遍历
letterCounts数组,如果某个字母的出现次数不少于k次,则计数器count加 1。 -
输出结果:
System.out.println(solution("aaabcd", 2) == 1); System.out.println(solution("aacbcbdefghijklmnopqrstuvwxyz", 1) == 26); System.out.println(solution("zzzzzzabc", 3) == 1);在
main方法中,我们调用solution方法,并打印结果以验证其正确性。
总结
这个问题展示了如何通过遍历字符串、使用数组进行字符计数,以及条件判断来解决实际问题。这种方法在字符串处理中非常常见,可以应用于各种类似的计数问题。通过理解和实现这个解决方案,我们可以更好地掌握字符串处理的基本技巧,并为解决更复杂的问题打下基础。