📅  最后修改于: 2023-12-03 15:36:26.463000             🧑  作者: Mango
在一个给定的字符串中,如果每个字母出现的频率都是唯一的,那么该字符串就是有效的。你需要使每个字母的出现频率都唯一,所需删除的最小数量是多少?
输入: "eeeeffff" 输出: 1 解释: 我们可以删除一个字符,即删除一个 'e' ,得到 "eeeffff"。
输入: "aabbffddeaee" 输出: 6 解释: 我们需要删除 6 个字符,即删除所有出现次数大于等于 2 次的字符,得到一个有效的字符串 "abcdef"。
输入: "lllll" 输出: 0 解释: 由于所有字符都具有相同的出现次数,所以不需要删除任何字符。
对于一个字母出现次数的计数,我们可以通过哈希表来实现。遍历字符串,并把每个字符出现的次数记录在哈希表中。此外,我们还需要一个哈希表,记录每个出现次数出现的次数,即每个出现次数有几个字符出现这么多次。
遍历上述两个哈希表,可以算出最少需要删除的字符数。具体地,如果有两个或以上的字符出现次数相同,我们只需要保留一个(因为保留多个不会使得所有字符出现次数都唯一)
,其余的都需要删除。如果出现次数不同的字符出现的次数是相同的,则任意删除一个即可。
以下代码实现了上述算法:
class Solution:
def minDeletions(self, s: str) -> int:
freq = {}
for c in s:
freq[c] = freq.get(c, 0) + 1
count_freq = {}
for count in freq.values():
count_freq[count] = count_freq.get(count, 0) + 1
res = 0
for count, count_cnt in count_freq.items():
while count_cnt > 1 and count > 0:
count_cnt -= 1
count -= 1 # 删除该出现次数的一个字符
res += 1
return res
该算法的时间复杂度为 O(n)
,其中 n 是字符串的长度。这是因为遍历了两次字符串,并且每个字符只被哈希表遍历一次。空间复杂度为 O(n)
,由于哈希表存储了每个字符出现的次数和每个出现次数出现的次数。