小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
问题理解
给定一个只包含小写字母的字符串 S,我们需要通过一系列操作使得字符串中的所有字母都不相同。每次操作可以选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。我们需要计算最少需要多少次操作才能达到目标。
数据结构选择
- 字符频率计数:我们可以使用一个字典来统计每个字符在字符串中出现的频率。
- 优先队列:为了高效地处理频率最高的字符,我们可以使用一个优先队列(最大堆)来存储字符频率。
算法步骤
-
统计字符频率:遍历字符串
S,统计每个字符的出现次数。 -
构建优先队列:将字符频率放入优先队列中,频率最高的字符优先处理。
-
处理字符频率:
-
从优先队列中取出频率最高的字符。
-
如果该字符的频率大于1,则需要进行操作:
- 减少该字符的频率(每次减少2,因为每次操作删除两个相同的字符)。
- 增加操作次数。
- 将剩余的频率重新放回优先队列。
-
-
返回操作次数:最终的操作次数即为所需的最少操作次数。
-
代码提示
-
统计字符频率:使用
collections.Counter来统计字符串中每个字符的出现次数。 -
构建优先队列:使用
heapq模块来实现一个最大堆。 -
处理字符频率:从优先队列中取出频率最高的字符,进行必要的操作,并更新操作次数。
代码框架
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)
关键步骤解释
-
统计字符频率:
python
freq = Counter(S)
使用
Counter统计字符串中每个字符的出现次数。 -
构建优先队列:
python
max_heap = [-count for count in
freq.values()]
heapq.heapify(max_heap)
将字符频率转换为负数,以便使用
heapq实现最大堆。 -
处理字符频率:
python
while max_heap:
count = -heapq.heappop(max_heap)
if count > 1:
count -= 2
operations += 1
if count > 0:
heapq.heappush
(max_heap, -count)
从优先队列中取出频率最高的字符,进行必要的操作,并更新操作次数。