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

51 阅读3分钟

问题描述

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

测试样例

样例 1

输入S = "abab"

输出2

样例 2

输入S = "aaaa"

输出2

样例 3

输入S = "abcabc"

输出3

解题思路分析

本题的目标是通过尽可能少的操作,使字符串中所有字符都唯一。以下是问题的详细分析和解决步骤:

问题分析

1. 字符重复统计

  • 如果字符串中某些字符出现次数大于 1,则表示有重复字符。
  • 我们需要通过操作消除这些重复,使得每种字符仅出现一次。

2. 操作效果

  • 每次操作可以:
    • 删除两个相同的字符。
    • 在字符串末尾添加一个任意字符。

3. 操作次数计算

  • 每次操作能消除两个相同的字符。
  • 对于每个字符,其出现次数如果为 count,可以通过 count // 2 次操作消除重复对。
  • 总的操作次数是所有字符所需操作次数的累加。

解题步骤

  1. 统计字符频率: 使用一个字典或类似的数据结构,统计字符串中每个字符的出现次数。

  2. 计算字符对的数量: 对每个字符,计算其出现次数除以 2 得到的整数部分,即该字符的重复对数量。

  3. 累加操作次数: 总操作次数等于所有字符对数的累加值。

代码实现

def solution(S):
    from collections import Counter
    
    # 统计每个字符出现的频率
    freq = Counter(S)
    
    # 计算所有字符的重复对数
    total_pairs = sum(count // 2 for count in freq.values())
    
    # 总的操作次数就是重复对的总数
    return total_pairs

知识点总结

1. 字符统计

可以使用Python的 collections.Counter 高效统计字符出现次数,也可以通过遍历字符串手动统计。

2. 数学运算

对于每种字符,其需要的操作数等于出现次数除以2的整数部分:

  • count // 2 表示可以消除的字符对数。

3. 时间复杂度

  • 字符统计需要遍历整个字符串,时间复杂度为 O(n)O(n)
  • 累加操作次数的计算涉及对所有字符频率进行简单运算,时间复杂度为 O(k)O(k),其中 kk 是字符种类数。
  • 综合时间复杂度为 O(n+k)O(n + k),在大多数情况下接近 O(n)O(n)

思考与优化

1. 特殊边界条件

  • 空字符串:无需操作,结果为 0
  • 全部字符唯一:无需操作,结果为 0
  • 全部字符相同:需要 (len(S) // 2) 次操作。

2. 应用场景扩展

该问题的核心思想在于"消除重复",可以用于类似问题:

  • 消除数组中的重复元素。
  • 最小化某种操作次数以优化资源使用。

3. 时间优化可能性

由于本题的算法复杂度已经很低,实际优化空间不大。