📌  相关文章
📜  使每个字母的频率唯一所需的最少删除(1)

📅  最后修改于: 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),由于哈希表存储了每个字符出现的次数和每个出现次数出现的次数。