leetcode 5562. 字元頻次唯一的最小刪除次數(C++)

我很忙2010發表於2020-11-08

如果字串 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 僅含小寫英文字母

C++

class Solution {
public:
    int minDeletions(string s) {
        vector<int> tmp(26,0);
        int n=s.size();
        for(int i=0;i<n;i++) {
            tmp[s[i]-'a']++;
        }
        int ans=0;
        vector<int> vec(n+1,0);
        for(auto it:tmp) {
            if(it) {
                vec[it]++;
            }
        }
        for(int i=n;i>0;i--) {
            if(vec[i]>1) {
                ans+=vec[i]-1;
                vec[i-1]+=vec[i]-1;
            }
        }
        return ans;
    }
};

 

相關文章