最少字符串操作次数问题解析 | 豆包MarsCode AI刷题

112 阅读5分钟

最少字符串操作次数问题解析 | 豆包MarsCode AI刷题

在算法学习的道路上,刷题是提升编程能力和算法思维的有效途径。今天,我选择了豆包MarsCode AI刷题平台中的一道题目“最少字符串操作次数”进行解析,希望能与大家分享我的解题思路和心得。

一、题目描述

最少字符串操作次数

小U得到了一个只包含小写字母的字符串 S。她可以执行如下操作:

每次选择字符串中两个相同的字符删除,然后在字符串未尾添加一个任意的小写字母。

小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?


示例1:

• 输入:S = "abab"

• 输出:2


示例2:

• 输入:S = "aaaa"

• 输出:2


示例3:

• 输入:S = "abcabc"

• 输出:3

二、解题思路

  1. 理解题意

• 目标:通过最少的操作使字符串中的所有字符都不相同。

• 操作规则:

o 删除:每次可以删除两个相同的字符。

o 添加:删除后,在字符串末尾添加一个任意的小写字母。

2. 分析

• 重复字符处理:为了使所有字符都不相同,需要处理字符串中所有的重复字符。

• 操作次数:每次操作可以消除两个相同的字符,但会新增一个字符(可能是新的重复字符)。

• 策略:尽可能多地消除重复字符,同时控制新增字符的影响。

  1. 解决方案

• 统计字符频率:统计每个字符出现的次数。

• 计算操作次数:

o 对于每个字符,出现次数为 count。

o 需要进行 count // 2 次操作来消除重复的字符对。

• 总操作次数:将所有字符的操作次数相加。

  1. 举例验证

• 示例1:

o 字符频率:{'a': 2, 'b': 2}

o 操作次数:(2 // 2) + (2 // 2) = 1 + 1 = 2

• 示例2:

o 字符频率:{'a': 4}

o 操作次数:4 // 2 = 2

• 示例3:

o 字符频率:{'a': 2, 'b': 2, 'c': 2}

o 操作次数:(2 // 2) + (2 // 2) + (2 // 2) = 1 + 1 + 1 = 3

三、代码实现

image.png

四、代码详解

• 导入库:

from collections import Counter

Counter 用于统计字符出现的次数。

• 函数定义:

def solution(S: str) -> int:

定义函数,接收字符串 S。

• 统计字符频率:

counts = Counter(S)

得到一个字典,键为字符,值为出现次数。

• 计算操作次数:

for count in counts.values():

    operations += count // 2

对每个字符,计算所需的操作次数并累加。

• 返回结果:

return operations

线条图示例

以下是一个示例线条图,用于解释如何计算最少的字符串操作次数。我们以字符串 S = "abcabc" 为例。

image.png

步骤1:统计字符频率

首先,我们需要统计字符串中每个字符出现的次数。对于字符串 S = "abcabc":

• 字符 a 出现了 2 次

• 字符 b 出现了 2 次

• 字符 c 出现了 2 次

步骤2:计算每个字符的操作次数

根据题目规则,每次操作可以删除 两个相同的字符,并在字符串末尾添加一个任意的小写字母。因此,对于每个字符出现的次数 count,所需的操作次数为 count // 2(即整除2)。

• 对于字符 a,需要的操作次数为 2 // 2 = 1

• 对于字符 b,需要的操作次数为 2 // 2 = 1

• 对于字符 c,需要的操作次数为 2 // 2 = 1

步骤3:计算总操作次数

将所有字符的操作次数相加,得到总的最少操作次数:

总操作次数 = 1 (a) + 1 (b) + 1 (c) = 3

操作过程示意

为了更好地理解,以下是操作过程的详细示意:

  1. 初始字符串:a b c a b c

  2. 第一次操作:

    o 删除两个 a,字符串变为 b c b c

    o 添加一个新字符(例如 d),字符串变为 b c b c d

  3. 第二次操作:

    o 删除两个 b,字符串变为 c c d

    o 添加一个新字符(例如 e),字符串变为 c c d e

  4. 第三次操作:

    o 删除两个 c,字符串变为 d e

    o 添加一个新字符(例如 f),字符串变为 d e f

最终,字符串中的所有字符均不重复,操作完成。

五、复杂度分析

• 时间复杂度:O(n),其中 n 为字符串长度。统计字符频率和遍历次数都是线性的。

• 空间复杂度:O(1),因为字符集为小写字母,最多有26个不同的字符。

六、知识总结

• 哈希表的应用:利用 Counter 统计元素频率,是解决字符串统计问题的常用方法。

• 贪心策略:每次操作消除两个相同字符,符合贪心思想,确保每次操作都最大化当前收益。

• 整数除法:count // 2 表示整除,计算成对的重复字符数量。 七、学习心得

在解决字符串操作类问题时,理解题意和操作规则至关重要。利用数据结构(如哈希表)和算法思想(如贪心)能够有效简化问题。建议同学们多练习类似的题目,培养算法思维。

八、举一反三

• 相关题目:

o 消除游戏:给定一个字符串,能否通过相邻字符消除使其为空。

o 唯一字符:找出字符串中第一个不重复的字符。

• 思考延伸:

o 如果操作改为每次只能删除一个字符,最少需要多少次操作?

o 如果字符集扩展到所有ASCII字符,该如何处理?

九、学习计划

• 巩固基础:熟练掌握字符串和哈希表的操作。

• 算法训练:多做贪心、动态规划等算法题目,提高解题效率。

• 工具运用:利用豆包MarsCode AI刷题平台,制定刷题计划,记录错题,总结经验。

十、工具运用

在使用豆包MarsCode AI刷题平台时,可以充分利用以下功能:

• 题目分类:根据算法类型选择题目,系统性地练习。

• 代码运行:即时运行代码,验证思路是否正确。

• 错题本:记录做错的题目,定期回顾。