题目:最少字符串操作次数
问题描述
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
测试样例
样例1:
输入:
S = "abab"
输出:2
样例2:
输入:
S = "aaaa"
输出:2
样例3:
输入:
S = "abcabc"
输出:3
题目解析
题目思路
题目要求将一个字符串中的所有字母通过最少的操作删除,使得字符串中的所有字母都不相同。每次操作允许删除两个相同的字符,并在字符串末尾添加一个任意的小写字母。为了完成这个任务,我们的目标是计算出最少需要执行多少次操作。
- 字符频率统计:首先,统计字符串中每个字符出现的次数。如果一个字符出现的次数大于1,则需要通过删除操作减少其出现次数,直到每个字符都只出现一次。
- 删除操作:每次操作删除两个相同的字符。所以,如果某个字符的频率是
freq,那么需要freq // 2次删除操作才能将该字符的出现次数减少到1。 - 计算最少操作次数:遍历字符串中每个字符的频率,累加所有字符的删除操作次数,最后得到最少的操作次数。
图解
假设我们有字符串 "abab",我们可以按以下方式进行删除操作:
- 统计字符频率:
a出现2次,b出现2次。 - 对于字符
a,删除一对a,剩余字符串:"b"。 - 对于字符
b,删除一对b,剩余字符串为空。 - 最终操作次数是2次。
这个过程是直接的,关键在于理解每个字符频率的影响,按频率处理每个字符。
代码详解
python
复制代码
from collections import Counter
def solution(S: str) -> int:
# 统计字符串中每个字符的出现次数
count = Counter(S)
operations = 0
# 遍历每个字符的出现次数
for char, freq in count.items():
# 如果字符的出现次数大于1,需要进行操作
if freq > 1:
# 删除一对字符
operations += freq // 2
return operations
# 测试样例
if __name__ == '__main__':
print(solution("abab") == 2) # 2
print(solution("aaaa") == 2) # 2
print(solution("abcabc") == 3) # 3
- Counter(S) :我们使用
Counter来统计字符串S中每个字符出现的次数。 - 遍历频率字典:对每个字符的出现次数
freq进行遍历。若出现次数大于1,表示有重复字符需要删除,通过freq // 2计算出所需的操作次数。 - 累加操作次数:将所有字符的操作次数累加起来,最终得到最少的操作次数。
- 测试:通过几个简单的测试样例验证代码的正确性。
知识总结
在使用豆包MarsCode AI刷题的过程中,我总结出了一些关键知识点:
- 频率统计:在许多问题中,统计某个元素的出现频率是解决问题的第一步。通过
Counter或哈希表的方式进行频率统计,可以简化问题的求解过程。 - 贪心思想:许多问题需要根据频率做出最优选择。在本题中,通过贪心策略,每次尽可能删除一对相同字符,是最优的解法。
- 整除运算:对于需要成对删除字符的情况,使用
freq // 2来计算每个字符所需的删除次数,这种运算在很多问题中都非常常见。
对其他入门同学的学习建议
- 学习频率统计:掌握如何快速统计元素出现的频率是很多问题的基础。可以使用 Python 中的
Counter或自己实现频率统计。 - 贪心策略的应用:很多时候问题的最优解是通过贪心策略求得的,理解和掌握贪心策略是刷题的关键。
- 分解问题:将复杂的问题分解成多个小问题,逐步解决。比如本题,首先统计频率,再计算操作次数。
学习计划
刷题计划
- 每天至少完成1道题:选择难度适中的题目,每天至少做一道题,逐步增加难度。
- 定期复习错题:每周至少回顾一次自己的错题,分析错误原因,并重新做一遍。
- 分类刷题:根据不同的题目类型(如动态规划、贪心算法、树、图等)进行分类刷题,集中攻克自己的薄弱点。
针对性学习
- 总结错题:每次做错的题目都要做详细的总结。可以将错题记录在笔记中,分析每道题的知识点,并尝试找到改进的方法。
- 模拟考试:可以通过模拟考试来提高自己做题的速度和准确性,逐渐适应考试的节奏。
工具运用
- 结合MarsCode AI和其他学习资源:利用MarsCode AI刷题时,可以配合其他平台(如LeetCode、牛客网)的题库,进行多样化的练习。MarsCode AI可以用来辅助理解和查找思路,而其他平台则能提供更多不同类型的题目。
- 利用视频教程和书籍:如果遇到不懂的题目,可以通过搜索视频教程或者阅读书籍来弥补知识的不足,理解算法的细节。
- 借助AI总结和提示:在学习过程中遇到困难时,可以使用AI工具生成思路总结和详细解释,快速提升理解效率。
通过这种方式,结合多种学习资源,可以更高效地提高自己的编程和算法能力。