问题描述
给定一个字符串 𝑠s,你需要通过删除一些字符,使得每个字符在字符串中出现的次数均不相同。你需要找出最少需要删除的字符数量以达到这个目标。
例如,对于字符串 "aab",字符 "a" 出现2次,字符 "b" 出现1次,这些出现次数已经不同,因此不需要删除任何字符,输出为0。
测试样例
样例1:
输入:
s = "aab"
输出:0
样例2:
输入:
s = "aaabbbcc"
输出:2
样例3:
输入:
s = "abcdef"
输出:5` def solution(s: str) -> int:
from collections import Counter
char_count = Counter(s)
count_set = set()
deletion_count = 0
for char, count in char_count.items():
while count in count_set:
count -= 1
deletion_count += 1
if count > 0:
count_set.add(count)
return deletion_count
if name == 'main':
print(solution("aab") == 0)
print(solution("aaabbbcc") == 2)
print(solution("abcdef") == 5)`
1. 首先使用 `Counter` 类统计输入字符串 `s` 中每个字符出现的次数,得到一个字典 `char_count`,其中键是字符,值是该字符出现的次数。
- 然后遍历
char_count中的每个字符及其出现次数。对于每个字符的出现次数,如果这个次数已经在count_set中(意味着已经有其他字符出现了相同的次数),就不断减少这个次数,并增加deletion_count,直到这个次数不在count_set中。 - 如果最终这个字符的出现次数大于 0,就将其加入到
count_set中。 - 最后返回
deletion_count,即达到每个字符出现次数均不同的目标所需要删除的最少字符数量
1. 算法目的
该算法旨在处理一个输入字符串,通过统计字符串中每个字符出现的次数,然后根据特定规则对出现次数进行调整,使得最终每个不同字符的出现次数都互不相同,算法最终返回为达到此目标所需要删除的字符数量。
2. 数据结构选择及作用
- Counter:从
collections模块引入的Counter类用于高效地统计输入字符串中每个字符的出现次数。它以字符为键,字符出现的次数为值,构建了一个类似字典的结构。这种数据结构能够快速获取每个字符的出现频次信息,为后续的处理提供了基础数据。 - set:创建的空集合
count_set用于存储已经出现过的字符出现次数。集合的特性是元素的唯一性,这使得它非常适合用于判断某个出现次数是否已经存在,从而确定是否需要对相应字符的出现次数进行调整(即删除字符以改变出现次数)。
3. 算法步骤及逻辑
统计字符出现次数
- 首先,使用
Counter对输入字符串s进行处理,得到char_count,它准确地记录了每个字符在字符串中出现的次数。例如,对于字符串 "aaabbbcc",char_count可能会记录{'a': 3, 'b': 3, 'c': 2}。
遍历并调整出现次数
-
接着,通过遍历
char_count中的每个键值对(即每个字符及其出现次数)来进行核心的调整操作:- 对于每个字符的出现次数
count,首先检查它是否已经在count_set中。如果在,说明存在其他字符也有相同的出现次数,这不符合每个字符出现次数互不相同的目标,所以需要进入一个内部的while循环进行调整。 - 在
while循环中,每次将count减 1,表示删除一个该字符,同时将deletion_count增加 1,以记录删除操作的次数。这个过程会持续进行,直到count不在count_set中为止,也就是使得该字符的出现次数变得独一无二。 - 当
count不在count_set中且count大于 0 时,就将这个经过调整后的count值添加到count_set中,以便后续判断其他字符的出现次数是否与之重复。
- 对于每个字符的出现次数
返回结果
- 最后,经过对所有字符出现次数的遍历和必要的调整后,算法返回
deletion_count,这个值就是为了使每个字符的出现次数都互不相同而需要删除的字符数量。