字符频次唯一的最小删除次数
题目描述
如果字符串s中不存在两个不同字符频次相同的情况,就称s是优质字符串。
给你一个字符串s,返回使s成为优质字符串需要删除的最小字符数。
字符串中字符的频次是该字符在字符串中的出现次数。例如,在字符串"aab"中,'a'的频次是2,而'b'的频次是1。

题解
因为数据仅含有26个小写字母,可以直接将字符转化成数字记录并且存储出现的次数。sort排序,然后从次数最多的开始处理。为了避免有多个重复次数,用last存储原有的次数,将cnt[i]修改为cnt[i+1]-1的值,确保没有重复的数值。
class Solution {
public:
int minDeletions(string s) {
vector<int>cnt(26,0);
for(auto i:s) cnt[i-'a']++;
sort(cnt.begin(),cnt.end());
int ans=0;
for(int i=24;i>=0;i--)
if(cnt[i]>0&&cnt[i]>=cnt[i+1]){
int last=cnt[i];
cnt[i]=(cnt[i+1]==0)?0:cnt[i+1]-1;
ans+=last-cnt[i];
}
//for(auto i:cnt) cout<<i<<" ";
return ans;
}
};

浙公网安备 33010602011771号