最少字符串操作次数 | 豆包MarsCode AI 刷题

133 阅读2分钟

题目:

小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 统计字符频率,还掌握了排序、数学运算、循环与累加等基本编程技巧。此外,我还学会了如何分析和改进代码,以确保其逻辑正确性。