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

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

题目描述

如果字符串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;
    }
};
posted @ 2021-11-15 22:27  Chilyyy  阅读(18)  评论(0)    收藏  举报