📌  相关文章
📜  需要删除的最少字符数,以便每个字符出现相同的次数(1)

📅  最后修改于: 2023-12-03 15:42:25.909000             🧑  作者: Mango

需要删除的最少字符数,以便每个字符出现相同的次数
问题描述

给定一个只包含小写字母的字符串,你需要写一个算法来判断这个字符串能否通过删除一个或者多个字符后变成一个具有相同字符个数的字符串。

如果可以,返回需要删除的最少字符数。否则,返回-1。

示例

输入: "aab"

输出: 0

解释: 可以删掉一个 'a',剩余字符出现次数相等。

输入: "aaabbb"

输出: 2

解释: 先删掉一个 'a',让剩余字符出现次数相等,再删掉一个 'b'。

输入: "abc"

输出: -1

解释: 无法使每个字符出现次数相等。

解法

这是一道比较典型的哈希表问题。我们可以先统计字符串中各个字符出现的次数,然后找出出现次数最多的字符,设其出现次数为count。

显然,如果去掉除了出现次数最多的字符以外的任意一个字符,那么所剩字符串中各个字符出现次数相等的充要条件是:count-1等于其他所有字符出现次数之和。

如果出现次数最多的字符只有一个,这个条件就一定成立,这时需要删除的最少字符数就是字符串总长度减去出现次数最多的字符的出现次数。

如果出现次数最多的字符不止一个,那么依次尝试删除其他字符,看是否能满足条件。同时记得要统计所需要删除字符个数的最小值。

代码实现
def minDeletions(s: str) -> int:
    d = {}
    for c in s:
        d[c] = d.get(c, 0) + 1

    max_count = max(d.values())
    if max_count == len(s):
        return 0

    min_deletions = float('inf')
    for i in range(1, max_count + 1):
        deletions = 0
        for c, count in d.items():
            if count >= i:
                deletions += count - i
            else:
                deletions += count
        min_deletions = min(min_deletions, deletions)

    return min_deletions
时间复杂度

时间复杂度为O(n),其中n为字符串长度。统计字符出现次数需要遍历整个字符串一次,而后面要枚举出现次数等于最多的字符出现次数的不同情况,最多不超过字符串长度,因此时间复杂度为O(n)。