Skip to content

Latest commit

 

History

History
 
 

1647

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

A string s is called good if there are no two different characters in s that have the same frequency.

Given a string s, return the minimum number of characters you need to delete to make s good.

The frequency of a character in a string is the number of times it appears in the string. For example, in the string "aab", the frequency of 'a' is 2, while the frequency of 'b' is 1.

 

Example 1:

Input: s = "aab"
Output: 0
Explanation: s is already good.

Example 2:

Input: s = "aaabbbcc"
Output: 2
Explanation: You can delete two 'b's resulting in the good string "aaabcc".
Another way it to delete one 'b' and one 'c' resulting in the good string "aaabbc".

Example 3:

Input: s = "ceabaacb"
Output: 2
Explanation: You can delete both 'c's resulting in the good string "eabaab".
Note that we only care about characters that are still in the string at the end (i.e. frequency of 0 is ignored).

 

Constraints:

  • 1 <= s.length <= 105
  • s contains only lowercase English letters.

Related Topics:
String, Greedy, Sorting

Similar Questions:

Solution 1. Greedy

Count the frequencies and sort them in descending order. Then the problem becomes finding the minimum substraction that turns this frequence sequence to a strictly decreasing sequence. We can do it greedily.

// OJ: https://leetcode.com/problems/minimum-deletions-to-make-character-frequencies-unique/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
    int minDeletions(string s) {
        int cnt[26] = {}, ans = 0;
        for (char c : s) cnt[c - 'a']++;
        sort(begin(cnt), end(cnt), greater<>());
        for (int i = 1; i < 26 && cnt[i]; ++i) {
            int n = max(0, min(cnt[i - 1] - 1, cnt[i])); // the new cnt[i] value should be at least zero, and no greater than `cnt[i-1]-1` and `cnt[i]` itself.
            ans += cnt[i] - n;
            cnt[i] = n;
        }
        return ans;
    }
};