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

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

题目描述

如果字符串 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值