豆包MarsCode:组成字符串ku的最大次数

问题描述

在这里插入图片描述


思路分析

1. 分析问题

  • 组成条件:每个 “ku” 需要 1 个 k 和 1 个 u
  • 约束条件:从字符串中选择的字符不能重复使用。
  • 目标:在给定字符串中,找到 ku 的数量,取其较小值作为结果,因为这是限制组成 “ku” 数量的瓶颈。

2. 分解问题

解决问题可以分为以下几个步骤:

  1. 统计字符频率

    • 遍历字符串,统计 ku 的出现次数。
    • 为了处理大小写,所有字符统一转换为小写或直接通过判断 char 忽略大小写。
  2. 计算限制条件

    • 每次组成一个 “ku”,需要同时消耗一个 k 和一个 u
    • 如果 k 的数量大于 u,那么能组成的 “ku” 取决于 u 的数量,反之亦然。
    • 因此结果是 min(出现次数k, 出现次数u)
  3. 返回结果

    • 返回能够组成 “ku” 的最大数量。

3. 伪代码

以下是伪代码逻辑:

function solution(s):
    初始化 countK = 0, countU = 0
    遍历字符串 s 中的每个字符 c:
        如果 c 是 'k' 或 'K',增加 countK
        如果 c 是 'u' 或 'U',增加 countU
    返回 min(countK, countU)

总结

解题的核心是统计两个目标字符的频率,并取其较小值作为结果。通过简单的遍历和条件判断即可实现。代码优化主要集中在可读性和效率提升方面,例如用 Character.toLowerCase 简化大小写处理,用 Math.min 替代手动判断等。


参考代码(Java)

public class Main {
    public static int solution(String s) {
        // 初始化 k 和 u 的计数器
        int countK = 0, countU = 0;

        // 遍历字符串并统计 k 和 u 的出现次数(忽略大小写)
        for (char c : s.toCharArray()) {
            if (Character.toLowerCase(c) == 'k') {
                countK++;
            } else if (Character.toLowerCase(c) == 'u') {
                countU++;
            }
        }

        // 返回 k 和 u 中较小的计数值,代表最多能组成的 "ku" 数量
        return Math.min(countK, countU);
    }

    public static void main(String[] args) {
        System.out.println(solution("AUBTMKAxfuu") == 1);
        System.out.println(solution("KKuuUuUuKKKKkkkkKK") == 6);
        System.out.println(solution("abcdefgh") == 0);
    }
}

代码分析

参数

  • String s: 输入字符串,只包含大小写英文字符。

返回值

  • int: 能组成 “ku” 的最大数量。

实现过程

  1. 变量初始化:

    int countK = 0, countU = 0;
    
    • 定义两个计数器,分别记录字符 ku 的数量。
  2. 遍历字符串:

    for (char c : s.toCharArray()) {
    
    • 使用增强型 for 循环,将字符串 s 转换为字符数组,并逐个访问字符。
  3. 统计字符频率:

    if (Character.toLowerCase(c) == 'k') {
        countK++;
    } else if (Character.toLowerCase(c) == 'u') {
        countU++;
    }
    
    • 使用 Character.toLowerCase 将字符转换为小写,避免区分大小写。
    • 如果字符是 ku,分别增加对应计数器。
  4. 计算结果:

    return Math.min(countK, countU);
    
    • 每个 “ku” 需要一个 k 和一个 u,因此能组成的 “ku” 数量是 countKcountU 中较小值。

复杂度分析

  1. 时间复杂度:

    • 遍历字符串一次,时间复杂度为 O(n) ,其中 n 是字符串长度。
  2. 空间复杂度:

    • 使用了两个整型变量 countKcountU,空间复杂度为 O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凭君语未可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值