问题描述
给定一个字符串 ss,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"。
问题分析
本问题的目标是从一个包含大小写字母的字符串中,计算最多能组成多少个字符串 "ku"。字符串的组成可以不考虑字符的顺序,且大小写忽略,因此我们可以将字符串中的所有字符视为小写字母。每次生成 "ku" 时,需要消耗一个 'k' 和一个 'u',因此计算最多的组合数问题可以转化为一个简单的字符计数和数学问题。
解题思路
- 统一大小写:
因为不区分大小写,我们可以将整个字符串转换为小写字母处理,方便统计字符。 - 统计字符频次:
使用字典(collections.Counter)统计字符串中每个字符出现的次数,记录'k'和'u'的频次。 - 计算可生成的 "ku" 数量:
每生成一个 "ku" 都需要一个'k'和一个'u'。因此,能生成的 "ku" 的数量等于字符'k'和'u'的频次中较小的那个。 - 返回结果:
输出可生成的最大 "ku" 数量。
实现代码
from collections import Counter
def max_ku_count(s: str) -> int:
# 将字符串转为小写
s = s.lower()
# 统计每个字符的出现次数
count = Counter(s)
# 获取 'k' 和 'u' 的频次
k_count = count.get('k', 0)
u_count = count.get('u', 0)
# 返回能组成的 "ku" 的最大数量
return min(k_count, u_count)
# 测试
input_str = "AUBTMKAxfuu"
print(max_ku_count(input_str)) # 输出: 1
核心步骤讲解
1. 将字符串统一为小写
由于大小写不敏感,直接将字符串转化为小写可以简化后续统计。Python 的 str.lower() 方法很高效,可以快速完成转换。
2. 统计字符频次
利用 Python 标准库 collections.Counter,可以快速统计字符串中每个字符出现的次数。对于不存在的字符,Counter 的返回值默认是 0,这样可以避免额外的条件判断。例如:
s = "AUBTMKAxfuu".lower()
count = Counter(s)
# count: {'a': 2, 'u': 3, 'b': 1, 't': 1, 'm': 1, 'k': 1, 'x': 1, 'f': 1}
3. 计算最大 "ku" 数量
字符串 "ku" 的每次生成都需要一个 'k' 和一个 'u'。因此能生成的最大数量由字符 'k' 和 'u' 的最小频次决定:
k_count = count.get('k', 0)
u_count = count.get('u', 0)
max_ku = min(k_count, u_count)
min(k_count, u_count) 确保在两个字符频次中选择较小值,避免资源不足的情况。
4. 返回结果
最后返回计算结果即可。
示例和边界测试
示例 1
输入:
"AUBTMKAxfuu"
输出:
1
解释:
'k' 的数量是 1,'u' 的数量是 3,因此最多生成 1 个 "ku"。
示例 2
输入:
"kkkkUUuu"
输出:
3
解释:
'k' 的数量是 4,'u' 的数量是 3,因此最多生成 3 个 "ku"。
边界测试
- 空字符串
输入:""
输出:0
解释:没有字符时,无法生成任何 "ku"。 - 无关字符
输入:"abcdef"
输出:0
解释:无'k'和'u'。 - 只有一种所需字符
输入:"kkkkk"
输出:0
解释:缺少'u'。
复杂度分析
-
时间复杂度:
- 字符串转换为小写:
O(n),其中n是字符串长度。 - 统计字符频次:
O(n),因为需要遍历整个字符串。 - 获取
'k'和'u'的频次:O(1)。 - 最终复杂度:
O(n)。
- 字符串转换为小写:
-
空间复杂度:
- 使用了
Counter存储字符频次,最坏情况下需要存储 26 个字母(固定大小):O(1)。
- 使用了
总结
这道题利用了字符频次统计和简单的最小值计算技巧。通过将大小写问题归一化,以及对字符频次的高效处理,算法实现简洁且高效。同时,边界条件的考虑也确保了算法的稳健性,是一个练习基本字符操作和计数问题的经典例子。