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

82 阅读3分钟

为求解这个问题,需要进行一些操作,每次删除字符串中两个相同的字符,并在字符串末尾添加一个新的字母。目标是尽量减少操作次数,使得字符串中的所有字母都不相同。

问题分析:

  1. 操作限制:每次操作可以删除两个相同的字符并添加一个新字符。我们可以把操作看作是“减少重复字符的数量”。

  2. 目标:通过最少的操作,使得字符串中每个字符都只出现一次。

  3. 关键点

    • 重复字符:关心的是字符串中哪些字符出现的次数超过一次。如果一个字符出现了 k 次,我们需要通过 k-1 次操作来将它的重复次数减少到1(因为每次操作能减少2个相同的字符)。
    • 新字符:每次删除一对字符后,会添加一个新的字符。因此,要关注删除重复字符的同时,新添加的字符也可能带来新的重复。

解决思路:

  1. 统计字符频率:首先计算每个字符在字符串中的出现频率。
  2. 操作次数:对于每个出现次数大于1的字符,需要进行 频次-1 次操作来删除重复的字符。
  3. 考虑新字符的影响:每次删除重复字符后,需要考虑新字符是否会引入新的重复字符。最坏的情况是每次都引入一个新字符,这意味着每次操作都会导致字符串长度增加1。

算法步骤:

  1. 统计字符频率:使用字典或 collections.Counter 来统计每个字符的出现次数。
  2. 计算最少操作次数:对每个字符的出现次数进行遍历,统计需要的操作次数。
  3. 处理操作次数:操作次数是根据字符出现的频率决定的,每次删除一对字符需要操作一次。

代码实现:

pythonCopy Code
from collections import Counter

def solution(S: str) -> int:
    # 统计每个字符的出现次数
    freq = Counter(S)
    
    # 初始化操作次数
    operations = 0
    
    # 处理所有字符的频率
    for count in freq.values():
        if count > 1:
            # 如果字符出现超过1次,至少需要 count // 2 次操作来删除重复
            operations += count // 2
    
    return operations

# 测试样例
if __name__ == '__main__':
    print(solution("abab"))  # 输出: 2
    print(solution("aaaa"))  # 输出: 2
    print(solution("abcabc"))  # 输出: 3

代码解析:

  1. Counter(S)Countercollections 模块中的一个工具,可以非常方便地统计字符串中每个字符的出现频率。
  2. operations += count // 2:对每个字符的频率 count,如果它大于1,则需要进行 count // 2 次操作。因为每次操作可以移除两个相同的字符,count // 2 表示最少需要多少次操作来移除这些字符的重复。

示例测试:

  • 对于输入 "abab",字符 'a' 和 'b' 都出现了 2 次,所以需要 2 // 2 = 1 次操作去删除 'a' 的一个重复字符,再删除 'b' 的一个重复字符。总共需要 2 次操作。
  • 对于输入 "aaaa",字符 'a' 出现了 4 次,所以需要 4 // 2 = 2 次操作。
  • 对于输入 "abcabc",字符 'a', 'b', 'c' 各出现 2 次,每个字符需要一次操作,总共需要 3 次操作。

时间复杂度分析:

  1. 统计频率Counter 的时间复杂度是 O(n),其中 n 是字符串的长度。
  2. 遍历频率表:遍历频率表的时间复杂度是 O(k),其中 k 是不同字符的数量,最坏情况下 k 最大为 26(即字母表中的字符数量)。

因此,总的时间复杂度是 O(n),其中 n 是字符串的长度。

结论:

这个算法在时间和空间上的复杂度都非常合适,能够高效地解决问题。