加载中...
1647-字符频次唯一的最小删除次数(Minimum Deletions to Make Character Frequencies Unique)
发表于:2021-12-03 | 分类: 中等
字数统计: 471 | 阅读时长: 2分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/minimum-deletions-to-make-character-frequencies-unique

英文原文

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.

中文题目

如果字符串 s不存在 两个不同字符 频次 相同的情况,就称 s优质字符串

给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。

字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 "aab" 中,'a' 的频次是 2,而 'b' 的频次是 1

 

示例 1:

输入:s = "aab"
输出:0
解释:s 已经是优质字符串。

示例 2:

输入:s = "aaabbbcc"
输出:2
解释:可以删除两个 'b' , 得到优质字符串 "aaabcc" 。
另一种方式是删除一个 'b' 和一个 'c' ,得到优质字符串 "aaabbc" 。

示例 3:

输入:s = "ceabaacb"
输出:2
解释:可以删除两个 'c' 得到优质字符串 "eabaab" 。
注意,只需要关注结果字符串中仍然存在的字符。(即,频次为 0 的字符会忽略不计。)

 

提示:

  • 1 <= s.length <= 105
  • s 仅含小写英文字母

通过代码

高赞题解

首先统计各个字母的出现个数,再使用HashSet进行去重。
HashSet中保存不同的数目,如果加进来的数目已经存在,就自减,减到HashSet中没有的数目

为什么不用排序?例如添加顺序为4 4 3 2 1和3 2 1 4 4,
第一种是把4 3 2 1每个数都减1,答案为4。
第二种是直接把最后一个4减到0,答案也是4.
所以答案只需要在乎去重自减时,减少的个数,而不用在意顺序

下面是代码:

class Solution {
    public int minDeletions(String s) {
        int[] a = new int[26];
        char[] cs = s.toCharArray();
        for (char c : cs) a[c - 'a'] ++;// 统计字母个数

        Set<Integer> h = new HashSet<Integer>();
        int res = 0;
        for (int i : a) {
            if (i != 0) {               // 有数目才进行判断
                while (h.contains(i)) { // set已经包含就自减
                    i --;
                    res ++;
                }
                if (i != 0) h.add(i);   // 自减到0时,表示完全删除了某个字母,不能加入set中
            }
        }
        return res;
    }
}

统计信息

通过次数 提交次数 AC比率
7727 14960 51.7%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1646-获取生成数组中的最大值(Get Maximum in Generated Array)
下一篇:
1648-销售价值减少的颜色球(Sell Diminishing-Valued Colored Balls)
本文目录
本文目录