力扣1647-字符频次唯一的最小删除次数

本文介绍了一种算法,用于确定将字符串转换为优质字符串所需的最少字符删除次数。优质字符串是指没有两个字符出现频率相同的字符串。文章详细阐述了贪心算法的实现过程,并通过实例进行了解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符频次唯一的最小删除次数

题目描述

如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 。

给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。

字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 “aab” 中,‘a’ 的频次是 2,而 ‘b’ 的频次是 1 。
输入:s = “ceabaacb”
输出:2
解释:可以删除两个 ‘c’ 得到优质字符串 “eabaab” 。
注意,只需要关注结果字符串中仍然存在的字符。(即,频次为 0 的字符会忽略不计。)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-deletions-to-make-character-frequencies-unique
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

贪心算法,局部最优,依次满足
1、首先统计每个字符的数量,保存到列表中并从大到小排序。
2、指针从第2个,i=1开始
3、如果L[i-1]>L[i],那么不用删除
4、如果L[i-1]==L[i],删除个数ans += 1,L[i]=L[i]-1
5、如果L[i-1]<L[i],删除个数ans += L[i]-L[i-1]+1,L[i] -= L[i]-L[i-1]+1
6、特殊情况,当列表中有字母数量已经删减至0,条件是L[i-1]==0,那么ans += 1,L[i] -= L[i]

class Solution:
    def minDeletions(self, s: str) -> int:
        ans = 0
        lst=list(collections.Counter(s).values())
        lst= sorted(lst , reverse=True)
        for i in range(1,len(lst)):
            if lst[i-1] ==0:
                ans+=lst[i]
                lst[i]=0
                continue
            if lst[i-1] == lst[i]:
                lst[i]-=1
                ans+=1
            else:
                if lst[i-1]<lst[i]:
                    ans += lst[i]-lst[i-1]+1
                    lst[i]=lst[i]-(lst[i]-lst[i-1]+1)
                    
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值