伴学笔记13| 豆包MarsCode AI刷题

133 阅读5分钟

最少字符串操作次数|刷题体会和心得

在解决问题时,我们不仅要实现功能,更要理解和思考代码的逻辑及其背后的设计思路。以下是我对这段代码的分析和心得体会。

问题描述

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

题目分析

我们需要处理一个字符串,目标是对其进行字符操作,使得最终的字符串满足一定的要求(如字符出现次数的限制)。在这个具体例子中,我们的任务是:

  1. 统计字符串中各字符的频率。
  2. 基于这些频率,计算我们需要删除的字符对数。
  3. 如果最终字符串的长度超过26个字符(即26个字母),则需要额外的删除操作。
代码讲解
def solution(S: str) -> int:
    # 统计字符频率
    frequency = {}
    for char in S:
        if char in frequency:
            frequency[char] += 1
        else:
            frequency[char] = 1

这段代码的作用是统计字符串S中每个字符的出现次数。通过一个字典frequency来记录每个字符的频率。遍历字符串S时,如果字符已经在字典中,就增加其计数;如果不存在,就将其添加到字典中并初始化计数为1。

接下来,我们计算需要删除的字符对数:

    # 计算需要删除的字符对数
    operations = 0
    for count in frequency.values():
        if count > 1:
            operations += count // 2

这里我们对每个字符的频率进行判断。如果某个字符的频率大于1,说明它出现了多次。我们可以通过整数除法count // 2计算出可以删除的字符对数。每一对重复的字符都需要删除一次,直到没有多余的字符为止。

接下来,我们计算最终字符串的长度:

    # 计算最终字符串的长度
    final_length = len(S) - 2 * operations

这行代码的意思是,从原始字符串长度中减去删除的字符数量。每对重复的字符删除两次,因此操作数乘以2,表示删除的字符总数。

最后,检查最终字符串的长度是否超过了26。如果超过了26,我们需要做更多的删除操作:

    # 如果最终字符串的长度超过26,需要额外的操作
    if final_length > 26:
        operations += final_length - 26

这段代码的逻辑是,如果最终字符串的长度超过26(即有超过26个不同的字母),我们需要删除一些字符来保持字符串的长度不超过26。所以,额外的删除操作数就是final_length - 26

最终返回操作数operations

测试
if __name__ == '__main__':
    print(solution(S = "abab") == 2)  # 删除两个字符
    print(solution(S = "aaaa") == 2)  # 删除两个字符
    print(solution(S = "abcabc") == 3)  # 删除三对字符

这些测试用例分别验证了不同类型的字符串。通过调用solution函数,我们可以检查字符串中的重复字符对数以及是否超出了26个字符的限制。

心得体会
  1. 字典应用:这个题目很好地展示了字典在频率统计中的应用。通过字典,我们能够快速地记录和更新字符的频率。

  2. 算法设计:算法的核心是频率统计和字符对数的计算。频率大于1的字符需要被删除,最终操作数就是通过删除这些重复字符来实现的。

  3. 整数除法的巧妙使用:在处理重复字符时,我们使用了整数除法来计算可以删除的字符对数,这是非常简洁且高效的做法。

  4. 性能考虑:从算法复杂度的角度来看,整个解决方案的时间复杂度是O(n),其中n是字符串的长度。这是一个非常高效的解决方案,因为我们只需要遍历字符串一次,构建频率字典,并进行一些简单的数值计算。

  5. 边界条件:处理了一个关键的边界条件——最终字符串长度不能超过26个字符。这要求我们在解决问题时不仅要关注重复字符,还要考虑字符种类的限制。

  6. 实际应用:类似的问题可以在很多实际场景中应用,比如字符串去重、字符统计以及字符优化等。在面试或算法比赛中,这类问题可以帮助我们锻炼解决复杂字符串问题的能力。

总结

这段代码简洁且高效地解决了字符串字符操作的问题,通过合理使用字典统计字符频率、计算需要删除的字符对数以及对结果进行处理,能够很好地实现目标。通过这道题,我深刻体会到了如何设计高效的字符处理算法,同时也加深了对字典、整数除法等常见编程技巧的理解。