青训营X豆包MarsCode 技术训练营第四课 | 豆包MarsCode AI 刷题

123 阅读5分钟

题目:最少字符串操作次数

问题描述

小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?


测试样例

样例1:

输入:S = "abab"
输出:2

样例2:

输入:S = "aaaa"
输出:2

样例3:

输入:S = "abcabc"
输出:3

题目解析

题目思路

题目要求将一个字符串中的所有字母通过最少的操作删除,使得字符串中的所有字母都不相同。每次操作允许删除两个相同的字符,并在字符串末尾添加一个任意的小写字母。为了完成这个任务,我们的目标是计算出最少需要执行多少次操作。

  1. 字符频率统计:首先,统计字符串中每个字符出现的次数。如果一个字符出现的次数大于1,则需要通过删除操作减少其出现次数,直到每个字符都只出现一次。
  2. 删除操作:每次操作删除两个相同的字符。所以,如果某个字符的频率是 freq,那么需要 freq // 2 次删除操作才能将该字符的出现次数减少到1。
  3. 计算最少操作次数:遍历字符串中每个字符的频率,累加所有字符的删除操作次数,最后得到最少的操作次数。

图解

假设我们有字符串 "abab",我们可以按以下方式进行删除操作:

  1. 统计字符频率:a 出现2次,b 出现2次。
  2. 对于字符 a,删除一对 a,剩余字符串:"b"
  3. 对于字符 b,删除一对 b,剩余字符串为空。
  4. 最终操作次数是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
  1. Counter(S) :我们使用 Counter 来统计字符串 S 中每个字符出现的次数。
  2. 遍历频率字典:对每个字符的出现次数 freq 进行遍历。若出现次数大于1,表示有重复字符需要删除,通过 freq // 2 计算出所需的操作次数。
  3. 累加操作次数:将所有字符的操作次数累加起来,最终得到最少的操作次数。
  4. 测试:通过几个简单的测试样例验证代码的正确性。

知识总结

在使用豆包MarsCode AI刷题的过程中,我总结出了一些关键知识点:

  1. 频率统计:在许多问题中,统计某个元素的出现频率是解决问题的第一步。通过 Counter 或哈希表的方式进行频率统计,可以简化问题的求解过程。
  2. 贪心思想:许多问题需要根据频率做出最优选择。在本题中,通过贪心策略,每次尽可能删除一对相同字符,是最优的解法。
  3. 整除运算:对于需要成对删除字符的情况,使用 freq // 2 来计算每个字符所需的删除次数,这种运算在很多问题中都非常常见。

对其他入门同学的学习建议

  1. 学习频率统计:掌握如何快速统计元素出现的频率是很多问题的基础。可以使用 Python 中的 Counter 或自己实现频率统计。
  2. 贪心策略的应用:很多时候问题的最优解是通过贪心策略求得的,理解和掌握贪心策略是刷题的关键。
  3. 分解问题:将复杂的问题分解成多个小问题,逐步解决。比如本题,首先统计频率,再计算操作次数。

学习计划

刷题计划

  1. 每天至少完成1道题:选择难度适中的题目,每天至少做一道题,逐步增加难度。
  2. 定期复习错题:每周至少回顾一次自己的错题,分析错误原因,并重新做一遍。
  3. 分类刷题:根据不同的题目类型(如动态规划、贪心算法、树、图等)进行分类刷题,集中攻克自己的薄弱点。

针对性学习

  1. 总结错题:每次做错的题目都要做详细的总结。可以将错题记录在笔记中,分析每道题的知识点,并尝试找到改进的方法。
  2. 模拟考试:可以通过模拟考试来提高自己做题的速度和准确性,逐渐适应考试的节奏。

工具运用

  1. 结合MarsCode AI和其他学习资源:利用MarsCode AI刷题时,可以配合其他平台(如LeetCode、牛客网)的题库,进行多样化的练习。MarsCode AI可以用来辅助理解和查找思路,而其他平台则能提供更多不同类型的题目。
  2. 利用视频教程和书籍:如果遇到不懂的题目,可以通过搜索视频教程或者阅读书籍来弥补知识的不足,理解算法的细节。
  3. 借助AI总结和提示:在学习过程中遇到困难时,可以使用AI工具生成思路总结和详细解释,快速提升理解效率。

通过这种方式,结合多种学习资源,可以更高效地提高自己的编程和算法能力。