青训营X豆包MarsCode技术训练营伴学笔记(3)|最少字符串操作次数|豆包MarsCode AI刷题

98 阅读4分钟

一、题目解析

1. 问题描述

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

测试样例

样例1:

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

样例2:

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

样例3:

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

2. 题目解析

本题要求最少的操作次数,使得字符串中所有字母都不相同。操作允许小U选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。分析如下:

统计字符频次:计算字符串中每个字符出现的次数。

计算重复字符的数量:如果一个字符出现次数大于1,说明该字符重复,需要消除至唯一。

操作次数:每对相同字符可通过一次操作进行消除,因此我们将每个字符的重复对数相加,得到最少的操作次数。

思路:

使用字典统计字符串中每个字符的频次。

对于每个字符,若出现次数大于1,说明该字符存在重复。每两次相同字符需要一次操作来消除,计算所有字符的消除次数并求和。

最后得出所有字符消除至唯一所需的最少操作次数。

图解:

例如,给定字符串 S = "abab"

统计字符频次,得 {'a': 2, 'b': 2}

字符 'a''b' 各出现2次,因此各需要1次操作消除多余字符,最终得到2次操作的总数。**

测试样例分析:

  • 示例1: 输入 "abab",字符 'a''b' 各有2个,需要2次操作。
  • 示例2: 输入 "aaaa",字符 'a' 有4个,需要2次操作。
  • 示例3: 输入 "abcabc",每个字符均重复2次,需要3次操作。

3. 代码详解

from collections import Counter

def solution(S: str) -> int:
    count = Counter(S)  # 统计每个字符的出现次数
    operations = 0  # 记录需要的操作次数

    # 遍历字符频率
    for freq in count.values():
        if freq > 1:
            # 计算需要的操作次数,每两个相同字符需要一次操作
            operations += freq // 2

    return operations
    pass

4. 时间和空间复杂度分析

时间复杂度:遍历字符串进行字符频次统计的时间复杂度为 O(N)O(N),其中 NN 为字符串的长度。

空间复杂度:使用了一个字典来存储字符的频次,空间复杂度为 O(M)O(M),其中 MM 为不同字符的数量,最大为26。

二、知识总结

新知识点:

  • 频次统计:使用 Counter 可快速统计字符频次,是处理字符串类问题的重要工具。
  • 成对计数:通过 count // 2 的整除操作,计算出重复字符对数,有助于减少操作次数。
  • 字符串消除操作的应用:本题中,操作次数取决于字符的成对消除,这种思想在类似去重、最小化操作次数的题目中有较广泛应用。

个人理解与学习建议:

  • 熟练掌握 Counter 的使用,包括如何进行字符统计和处理频次数据。
  • 多练习基于字符频次处理的题目,如去重、字符消除等,培养对字符串中频次分析的敏感度。
  • 注意操作最小化的思维训练,通过成对计数等方式减少多余操作,是许多字符串类题目中提升效率的关键。

三、学习计划

  1. 问题分解:将问题分解为“频次统计”“成对消除”等小步骤,逐步解决复杂问题。
  2. 刷题计划:每天进行类似字符串频次题目的练习,建议分为简单、中等、进阶等三类,每天选择1-2道题进行练习。
  3. 错题集:对每道题进行错误总结和优化思路的复盘,形成错题集,定期回顾以巩固。

四、工具运用

利用 AI 结合学习资源

  1. 代码生成和优化:编写代码后,使用AI工具帮助检查和优化,减少冗余代码,并找出逻辑或效率上的改进。
  2. 题解生成:通过AI生成题解,帮助快速总结解题思路。可以使用AI解释不同的思路和方法,提高解题技巧。
  3. 与在线题库结合:在豆包 MarsCode AI 等题库中找到相似题目,并结合AI解题工具,逐步构建题目间的联系,加深理解。