青训营X豆包MarsCode技术训练营第一课

61 阅读3分钟

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

问题理解

给定一个只包含小写字母的字符串 S,我们需要通过一系列操作使得字符串中的所有字母都不相同。每次操作可以选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。我们需要计算最少需要多少次操作才能达到目标。

数据结构选择

  1. 字符频率计数:我们可以使用一个字典来统计每个字符在字符串中出现的频率。
  2. 优先队列:为了高效地处理频率最高的字符,我们可以使用一个优先队列(最大堆)来存储字符频率。

算法步骤

  1. 统计字符频率:遍历字符串 S,统计每个字符的出现次数。

  2. 构建优先队列:将字符频率放入优先队列中,频率最高的字符优先处理。

  3. 处理字符频率

    • 从优先队列中取出频率最高的字符。

    • 如果该字符的频率大于1,则需要进行操作:

      • 减少该字符的频率(每次减少2,因为每次操作删除两个相同的字符)。
      • 增加操作次数。
      • 将剩余的频率重新放回优先队列。
  4. 返回操作次数:最终的操作次数即为所需的最少操作次数。

  5. 代码提示

  6. 统计字符频率:使用 collections.Counter 来统计字符串中每个字符的出现次数。

  7. 构建优先队列:使用 heapq 模块来实现一个最大堆。

  8. 处理字符频率:从优先队列中取出频率最高的字符,进行必要的操作,并更新操作次数。

代码框架

python

import heapq

from collections import Counter

def solution(S: str) -> int:

    # 统计字符频率

    freq = Counter(S)

    

    # 构建优先队列(最大堆)

    max_heap = [-count for count in 

    freq.values()]

    heapq.heapify(max_heap)

    

    # 初始化操作次数

    operations = 0

    

    # 处理字符频率

    while max_heap:

        # 取出频率最高的字符

        count = -heapq.heappop

        (max_heap)

        

        # 如果频率大于1,需要进行操作

        if count > 1:

            # 减少频率(每次减少2)

            count -= 2

            # 增加操作次数

            operations += 1

            # 如果还有剩余频率,放回优先

            队列

            if count > 0:

                heapq.heappush

                (max_heap, -count)

    

    return operations

if name == 'main':

    print(solution(S = "abab") == 2)

    print(solution(S = "aaaa") == 2)

    print(solution(S = "abcabc") == 

    3)

关键步骤解释

  1. 统计字符频率

    python

    freq = Counter(S)

    使用 Counter 统计字符串中每个字符的出现次数。

  2. 构建优先队列

    python

    max_heap = [-count for count in 

    freq.values()]

    heapq.heapify(max_heap)

    将字符频率转换为负数,以便使用 heapq 实现最大堆。

  3. 处理字符频率

    python

    while max_heap:

        count = -heapq.heappop(max_heap)

        if count > 1:

            count -= 2

            operations += 1

            if count > 0:

                heapq.heappush

                (max_heap, -count)

    从优先队列中取出频率最高的字符,进行必要的操作,并更新操作次数。