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

57 阅读3分钟

问题描述

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

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

测试样例

样例1:

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

样例2:

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

样例3:

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

问题理解

你需要从一个只包含英文字母的字符串中,计算最多能组成多少个字符串 "ku"。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。

数据结构选择

由于我们只需要统计字符 'k' 和 'u' 的数量,因此不需要复杂的数据结构。我们可以使用两个计数器来分别记录字符 'k' 和 'u' 的出现次数。

算法步骤

  1. 初始化计数器:创建两个计数器 ck 和 cu,分别用于记录字符 'k' 和 'u' 的出现次数。
  2. 遍历字符串:遍历字符串中的每个字符,将其转换为小写(或大写),然后根据字符是 'k' 还是 'u' 来增加相应的计数器。
  3. 计算结果:最终结果是 ck 和 cu 中的较小值,因为每个 "ku" 需要一个 'k' 和一个 'u'

详细步骤解释

  1. 初始化计数器

    • 我们需要两个计数器 ck 和 cu,分别用于记录字符 'k' 和 'u' 的出现次数。初始时,这两个计数器的值都为 0。
  2. 遍历字符串

    • 使用 for 循环遍历字符串中的每个字符。
    • 对于每个字符,首先将其转换为小写(或大写),以便忽略大小写的影响。可以使用 tolower 函数来实现这一点。
    • 然后,检查转换后的字符是否是 'k' 或 'u'。如果是 'k',则增加 ck 计数器的值;如果是 'u',则增加 cu 计数器的值。
  3. 计算结果

    • 在遍历完字符串后,ck 和 cu 分别记录了字符 'k' 和 'u' 的出现次数。
    • 由于每个 "ku" 需要一个 'k' 和一个 'u',因此最多能组成的 "ku" 的数量是 ck 和 cu 中的较小值。可以使用 min 函数来计算这个值。

总结

通过遍历字符串并统计字符 'k' 和 'u' 的出现次数,你可以很容易地计算出最多能组成多少个 "ku"。这个算法的时间复杂度是 O(n),其中 n 是字符串的长度,因为我们需要遍历字符串中的每个字符一次。

代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int solution(const string& s) {
    // write code here
    int ck = 0, cu = 0;
    for (auto c : s) {
        char ch = tolower(c);
        if (ch == 'k') ck++;
        else if (ch == 'u') cu++;
    }
    return min(ck, cu);
}

int main() {
    cout << (solution("AUBTMKAxfuu") == 1) << endl;
    cout << (solution("KKuuUuUuKKKKkkkkKK") == 6) << endl;
    cout << (solution("abcdefgh") == 0) << endl;
}

image.png