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

49 阅读3分钟

问题描述:

小U需要将字符串中的所有字符变得不相同。她可以进行以下操作:

  1. 每次选择两个相同的字符,从字符串中删除。

  2. 然后在字符串末尾添加一个任意的小写字母。

目标是计算最少操作次数,使得最终字符串中的所有字母都不相同。

示例分析:

样例1:

输入:S = "abab"

分析:

  • 字母频率统计:a: 2, b: 2。
  • 每个字母都重复2次,因此需要2次操作:
    • 删除两个a,补充一个新的字母。

    • 删除两个b,再补充一个新的字母。 输出:2。

样例2:

输入:S = "aaaa"

分析:

  • 字母频率统计:a: 4。
  • 有两个a是多余的,因此需要2次操作:
    • 删除两个a,补充一个新的字母。

    • 再删除两个a,补充一个新的字母。 输出:2。

样例3:

输入:S = "abcabc"

分析:

  • 字母频率统计:a: 2, b: 2, c: 2。
  • 每个字母都重复2次,因此需要3次操作:
    • 删除两个a,补充一个新的字母。

    • 删除两个b,补充一个新的字母。

    • 删除两个c,补充一个新的字母。 输出:3。

思路分析:

  1. 统计每个字符出现的次数。
  2. 对于每个字符,如果其出现次数超过1(即有重复),我们可以每次删除两个,并记录操作次数。
  3. 最后,将操作次数累加。

代码实现:

def solution(S: str) -> int:

    # 统计每个字符的频率
    char_count = {}
    operations = 0  # 记录操作次数

    for char in S:
        if char in char_count:
            char_count[char] += 1
        else:
            char_count[char] = 1

    # 计算多余字符需要的操作次数

    for count in char_count.values():
        operations += count // 2  # 每两个重复字符需要一次操作

    return operations

测试用例:

if __name__ == '__main__':

    # 测试样例

    print(solution("abab") == 2)   # 样例1

    print(solution("aaaa") == 2)  # 样例2

    print(solution("abcabc") == 3)  # 样例3



    # 补充测试

    print(solution("aabbccdd") == 4)  # 每个字母重复两次

    print(solution("z") == 0)  # 单个字母无需操作

    print(solution("aaaabbbbcccc") == 6)  # 每个字母有4次重复

知识总结与学习建议:

  1. 字符串字符频率统计:
  • 使用字典char_count存储每个字符的频率:char_count[char] += 1。
  • Python中的collections.Counter是更快捷的统计工具。
  1. 整除操作:
  • count // 2 用于计算每两个重复字符需要的操作次数,整除非常常用。
  1. 贪心策略:
  • 贪心法在优化操作次数的问题中非常高效。
  • 每次尽可能移除一对重复字符,降低后续问题复杂度。

学习建议:

  • 刷题时多关注如何分解问题:统计频率 -> 遍历处理 -> 累加结果。
  • 如果初学动态规划或贪心问题,先从这类频率统计题入手,逐步加深对算法思维的掌握。

工具运用:

  • 使用豆包MarsCode AI刷题库中的分布式练习功能,快速找到类似题目。
  • 将错题整理到笔记中,利用AI生成不同解法进行复盘。

通过上述计划与工具结合,可以逐步提升问题拆解能力和优化代码实现的能力。