题目:
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
测试样例 样例1:
输入:S = "abab" 输出:2
样例2:
输入:S = "aaaa" 输出:2
样例3:
输入:S = "abcabc" 输出:3
初步分析
通过分析题目可知:总的操作次数总是等于每个字符出现的次数的1/2(注意为整数,若为小数就向下取整即可)相加的和。
具体分析
导入模块:
from collections import Counterimport math
collections.Counter:用于统计字符串中每个字符的出现次数。 math:用于进行数学运算,这里主要使用 math.floor() 函数。
定义 solution 函数:
def solution(S: str) -> int:
该函数接受一个字符串 S 作为输入,并返回一个整数,表示最少需要多少次操作才能使得字符串中的所有字母都不相同。
统计字符频率:
freq = Counter(S)
使用 Counter 统计字符串 S 中每个字符的出现次数,并将结果存储在 freq 中。
将频率按从大到小排序:
freq_list = sorted(freq.values(), reverse=True)
将 freq 中的频率值提取出来,并按从大到小的顺序排序,结果存储在 freq_list 中。
初始化操作次数:
operations = 0
初始化操作次数 operations 为 0。
逐步减少频率,直到所有频率都不超过1:
for count in freq_list: operations += math.floor(count / 2)
遍历 freq_list 中的每个频率 count。 对于每个 count,计算 count / 2 并向下取整,然后将结果加到 operations 中。
具体代码
def solution(S: str) -> int:
freq = Counter(S)
freq_list = sorted(freq.values(), reverse=True)
operations = 0
for count in freq_list:
operations += math.floor(count /2)
return operations`
知识点
在这一题中,我运用了许多知识点。我在这里介绍一下。使用from collections import Counter导入 Counter 类用于统计元素频率。使用import math导入 math 模块用于数学运算。使用def solution(S: str) -> int来定义函数并使用类型注解。使用freq = Counter(S),使用Counter 统计字符频率。使用freq_list = sorted(freq.values(), reverse=True)对频率列表进行排序。使用 math.floor() 进行向下取整。使用for count in freq_list来遍历频率列表。再使用operations += math.floor(count / 2)来计算累加操作次数。
结论
通过解决这道题,不仅学会了如何使用 collections.Counter 统计字符频率,还掌握了排序、数学运算、循环与累加等基本编程技巧。此外,我还学会了如何分析和改进代码,以确保其逻辑正确性。