问题描述:
小U需要将字符串中的所有字符变得不相同。她可以进行以下操作:
-
每次选择两个相同的字符,从字符串中删除。
-
然后在字符串末尾添加一个任意的小写字母。
目标是计算最少操作次数,使得最终字符串中的所有字母都不相同。
示例分析:
样例1:
输入:S = "abab"
分析:
- 字母频率统计:a: 2, b: 2。
- 每个字母都重复2次,因此需要2次操作:
-
删除两个a,补充一个新的字母。
-
删除两个b,再补充一个新的字母。 输出:2。
-
样例2:
输入:S = "aaaa"
分析:
- 字母频率统计:a: 4。
- 有两个a是多余的,因此需要2次操作:
-
删除两个a,补充一个新的字母。
-
再删除两个a,补充一个新的字母。 输出:2。
-
样例3:
输入:S = "abcabc"
分析:
- 字母频率统计:a: 2, b: 2, c: 2。
- 每个字母都重复2次,因此需要3次操作:
-
删除两个a,补充一个新的字母。
-
删除两个b,补充一个新的字母。
-
删除两个c,补充一个新的字母。 输出:3。
-
思路分析:
- 统计每个字符出现的次数。
- 对于每个字符,如果其出现次数超过1(即有重复),我们可以每次删除两个,并记录操作次数。
- 最后,将操作次数累加。
代码实现:
def solution(S: str) -> int:
# 统计每个字符的频率
char_count = {}
operations = 0 # 记录操作次数
for char in S:
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
# 计算多余字符需要的操作次数
for count in char_count.values():
operations += count // 2 # 每两个重复字符需要一次操作
return operations
测试用例:
if __name__ == '__main__':
# 测试样例
print(solution("abab") == 2) # 样例1
print(solution("aaaa") == 2) # 样例2
print(solution("abcabc") == 3) # 样例3
# 补充测试
print(solution("aabbccdd") == 4) # 每个字母重复两次
print(solution("z") == 0) # 单个字母无需操作
print(solution("aaaabbbbcccc") == 6) # 每个字母有4次重复
知识总结与学习建议:
- 字符串字符频率统计:
- 使用字典char_count存储每个字符的频率:char_count[char] += 1。
- Python中的collections.Counter是更快捷的统计工具。
- 整除操作:
- count // 2 用于计算每两个重复字符需要的操作次数,整除非常常用。
- 贪心策略:
- 贪心法在优化操作次数的问题中非常高效。
- 每次尽可能移除一对重复字符,降低后续问题复杂度。
学习建议:
- 刷题时多关注如何分解问题:统计频率 -> 遍历处理 -> 累加结果。
- 如果初学动态规划或贪心问题,先从这类频率统计题入手,逐步加深对算法思维的掌握。
工具运用:
- 使用豆包MarsCode AI刷题库中的分布式练习功能,快速找到类似题目。
- 将错题整理到笔记中,利用AI生成不同解法进行复盘。
通过上述计划与工具结合,可以逐步提升问题拆解能力和优化代码实现的能力。