组成字符串ku的最大次数 | 豆包MarsCode AI刷题

60 阅读3分钟

问题描述

给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"


测试样例

样例1:

输入:s = "AUBTMKAxfuu"
输出:1

样例2:

输入:s = "KKuuUuUuKKKKkkkkKK"
输出:6

样例3:

输入:s = "abcdefgh"
输出:0

题目解析

1. 题目理解

我们需要计算一个字符串中最多可以组成多少个“ku”。
条件:

  • 字符串中的字符区分 ku
  • 字符串中的大小写字母不区分。
  • 每个字符只能使用一次。

步骤:

  • 统计字符串中 ku 出现的次数。
  • 两者中的较小值就是可以组成“ku”的最大数量,因为每个“ku”需要一个 k 和一个 u

2. 分析解题思路

  1. 统计字符频率:
  • 转换为统一的小写字母。
  • 使用一个计数器(如 HashMap 或数组)统计 ku 的出现次数。
  1. 计算可组成“ku”的数量:
  • 获取 ku 的频率。
  • 结果为两者中的最小值:Math.min(kCount, uCount)
  1. 输出结果:
  • 返回可组成“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”的最大数量
    
}

代码详解

  1. s.toLowerCase() 将字符串转为小写字母,保证大小写字母视为相同。

  2. HashMap 统计: 使用 HashMapku 分别计数:

    • 如果字符是 ku,在 HashMap 中增加计数。
  3. 获取频率: 使用 getOrDefault 方法确保 ku 不存在时返回默认值 0

  4. 计算结果: 使用 Math.min(kCount, uCount) 取较小值,表示能组成的最大“ku”数量

知识总结

  1. 大小写统一: 使用 toLowerCase 将字符串转为统一的小写,简化统计逻辑。

  2. 字符统计: 选择高效的方法(如 HashMap)统计目标字符出现次数。

  3. 频率限制: 利用 Math.min 计算两个频率的较小值,从而得出可组成的最大“ku”数量。

  4. 边界处理:

    • 如果没有 ku,返回默认值 0,避免空指针异常。
    • 测试多个边界条件:如无 ku,输入为空字符串等。

学习计划

通过豆包MarsCode AI的功能,我逐渐拾起算法的能力,所以接下来有时间,就会刷题,通过不同类型的题目,来不断提升自己的能力。

工具运用

1.题目分析功能: 通过豆包MarsCode AI的题目分析,能够找到我在解析题目中忽略的部分,也能给我提出不同的实现思路。

2.AI检查功能: 通过豆包AI的检查功能,大大减少的编码的错误,并且提出如何解决问题的方案,增加了编码的效率。