字符频次唯一的最小删除次数
题目描述
如果字符串 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