问题描述
给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"。
测试样例
样例1:
输入:
s = "AUBTMKAxfuu"
输出:1
样例2:
输入:
s = "KKuuUuUuKKKKkkkkKK"
输出:6
样例3:
输入:
s = "abcdefgh"
输出:0
题目解析
1. 题目理解
我们需要计算一个字符串中最多可以组成多少个“ku”。
条件:
- 字符串中的字符区分
k和u。- 字符串中的大小写字母不区分。
- 每个字符只能使用一次。
步骤:
- 统计字符串中
k和u出现的次数。- 两者中的较小值就是可以组成“ku”的最大数量,因为每个“ku”需要一个
k和一个u。
2. 分析解题思路
- 统计字符频率:
- 转换为统一的小写字母。
- 使用一个计数器(如
HashMap或数组)统计k和u的出现次数。
- 计算可组成“ku”的数量:
- 获取
k和u的频率。- 结果为两者中的最小值:
Math.min(kCount, uCount)。
- 输出结果:
- 返回可组成“ku”的最大数量。
3. 代码实现
public static int solution(String s) {
s = s.toLowerCase(); // 转换为统一的小写字母
//利用HashMap进行统计
HashMap<Character ,Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
// 使用 HashMap 统计 k 和 u 的出现次数
if(s.charAt(i) == 'k' || s.charAt(i) == 'u'){
map.put(s.charAt(i),map.getOrDefault(s.charAt(i),0 )+1 );
}
}
// 获取 k 和 u 的计数
Integer k = map.getOrDefault('k' , 0);
Integer u = map.getOrDefault('u' , 0);
return Math.min(k,u); // 返回可组成“ku”的最大数量
}
代码详解
-
s.toLowerCase(): 将字符串转为小写字母,保证大小写字母视为相同。 -
HashMap统计: 使用HashMap对k和u分别计数:- 如果字符是
k或u,在HashMap中增加计数。
- 如果字符是
-
获取频率: 使用
getOrDefault方法确保k或u不存在时返回默认值0。 -
计算结果: 使用
Math.min(kCount, uCount)取较小值,表示能组成的最大“ku”数量
知识总结
-
大小写统一: 使用
toLowerCase将字符串转为统一的小写,简化统计逻辑。 -
字符统计: 选择高效的方法(如
HashMap)统计目标字符出现次数。 -
频率限制: 利用
Math.min计算两个频率的较小值,从而得出可组成的最大“ku”数量。 -
边界处理:
- 如果没有
k或u,返回默认值0,避免空指针异常。 - 测试多个边界条件:如无
k或u,输入为空字符串等。
- 如果没有
学习计划
通过豆包MarsCode AI的功能,我逐渐拾起算法的能力,所以接下来有时间,就会刷题,通过不同类型的题目,来不断提升自己的能力。
工具运用
1.题目分析功能: 通过豆包MarsCode AI的题目分析,能够找到我在解析题目中忽略的部分,也能给我提出不同的实现思路。
2.AI检查功能: 通过豆包AI的检查功能,大大减少的编码的错误,并且提出如何解决问题的方案,增加了编码的效率。