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

如果字符串 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 的字符会忽略不计。)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-deletions-to-make-character-frequencies-unique
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

题解 : 

var minDeletions = function(s) {

    //1.先统计所有单词出现的数量,并且按大到小排序
    //按大到小把给数组去重
    let arr = {}
    for( i=0 ; i < s.length ; i++){
         Object.keys(arr).indexOf(s[i] ) >= 0 ? arr[s[i]]+=1:arr[s[i]] =1
    }
    let numb = []
    for (const k in arr) {
        if (arr.hasOwnProperty(k)) {
            numb.push(arr[k]);
        }
    };
    numb.sort((a,b) => {
        if(a>b){
            return -1
        }else{
            return 1
        }
    })
    console.log( numb);
    console.log(Math.max(...numb) );
    let count = 0
    for (let i = 1; i < numb.length; i++) {
         if(numb[i] == numb[i-1] && numb[i] > 0 ){
             numb[i]--
             count += 1
         }else if(numb[i] >numb[i-1] &&numb[i-1] > 0 ){
           
             count += (numb[i] - numb[i-1] +1)
             numb[i] = numb[i-1]-1
         }else if(numb[i] >numb[i-1] && numb[i-1] == 0 ){
            
             count += numb[i]
             numb[i] =0
         }
    }
   return count 
}
 
 
/* 注意事项
1. sort()函数对number排序的时候必须要传入函数 ,不然他就把数字当作字符串给你比较了。
2.要注意好相同数量的情况 
3.计数时要先计数在赋值 ,不然到时候你可能得到的数会偏小
posted @ 2020-11-12 22:44  执着的风  阅读(209)  评论(0)    收藏  举报