问题描述
给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"。
测试样例
样例1:
输入:
s = "AUBTMKAxfuu"
输出:1
样例2:
输入:
s = "KKuuUuUuKKKKkkkkKK"
输出:6
样例3:
输入:
s = "abcdefgh"
输出:0
问题理解
你需要从一个只包含英文字母的字符串中,计算最多能组成多少个字符串 "ku"。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
数据结构选择
由于我们只需要统计字符 'k' 和 'u' 的数量,因此不需要复杂的数据结构。我们可以使用两个计数器来分别记录字符 'k' 和 'u' 的出现次数。
算法步骤
- 初始化计数器:创建两个计数器
ck和cu,分别用于记录字符'k'和'u'的出现次数。 - 遍历字符串:遍历字符串中的每个字符,将其转换为小写(或大写),然后根据字符是
'k'还是'u'来增加相应的计数器。 - 计算结果:最终结果是
ck和cu中的较小值,因为每个"ku"需要一个'k'和一个'u'。
详细步骤解释
-
初始化计数器:
- 我们需要两个计数器
ck和cu,分别用于记录字符'k'和'u'的出现次数。初始时,这两个计数器的值都为 0。
- 我们需要两个计数器
-
遍历字符串:
- 使用
for循环遍历字符串中的每个字符。 - 对于每个字符,首先将其转换为小写(或大写),以便忽略大小写的影响。可以使用
tolower函数来实现这一点。 - 然后,检查转换后的字符是否是
'k'或'u'。如果是'k',则增加ck计数器的值;如果是'u',则增加cu计数器的值。
- 使用
-
计算结果:
- 在遍历完字符串后,
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;
}