问题描述
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
测试样例
样例1:
输入:
S = "abab"
输出:2
样例2:
输入:
S = "aaaa"
输出:2
样例3:
输入:
S = "abcabc"
输出:3
让我们来分析一下这个问题。
问题理解
你需要计算最少需要多少次操作才能使得字符串中的所有字母都不相同。每次操作可以选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。
数据结构选择
我们可以使用一个字典来统计每个字符的出现频率。
算法步骤
- 统计字符频率:使用
collections.Counter来统计字符串中每个字符的出现次数。 - 计算重复字符对数量:对于每个字符,如果它的出现次数大于1,那么可以计算出需要删除的对数。每对字符需要一次操作。
- 返回结果:返回总的操作次数。
关键点
- 对于每个字符,如果它的出现次数是
count,那么需要删除的对数是count // 2。 - 最终的操作次数就是所有字符需要删除的对数之和。
def solution(S):
from collections import Counter
# 统计字符频率
freq = Counter(S)
# 计算重复字符对数量
pairs_to_remove = sum((count // 2) for count in freq.values() if count > 1)
return pairs_to_remove
# 测试样例
print(solution("abab")) # 输出: 2
print(solution("aaaa")) # 输出: 2
print(solution("abcabc")) # 输出: 3
MarsCode AI
让我们来检查一下你编辑区的代码。
代码分析
- 统计字符频率:使用
collections.Counter来统计字符串中每个字符的出现次数。这部分代码是正确的。 - 计算重复字符对数量:对于每个字符,如果它的出现次数大于1,那么可以计算出需要删除的对数。每对字符需要一次操作。这部分代码也是正确的。
- 返回结果:返回总的操作次数。这部分代码也是正确的。
测试样例
solution("abab")应该返回2,因为可以删除两对a和b。solution("aaaa")应该返回2,因为可以删除两对a。solution("abcabc")应该返回3,因为可以删除两对a、一对b和一对c。