不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
如果字符串 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 <= 105s仅含小写英文字母
思路
- 遍历字符串生成各个字符的个数,生成字符为 key ,在字符串中出现的次数为 value 的对象 numObj;
- 通过 Object.value 获取到字符出现次数的数组 nums;
- 去重拿到 numsSet 和剩下的数字组成的数组 resetArr ;
- 遍历 resetArr 中每一项,查看是否在 numsSet 存在;
- 如果存在,那么当前数字做减操作,一直到 numsSet 不存在该数字;
- 如果不存在,判断当前数字是否为零,当不是零是加入到 numsSet 中;
/**
* @param {string} s
* @return {number}
*/
function minDeletions(s) {
const numObj = {};
let numsSet = new Set();
for (let i = 0, len = s.length; i < len; i++) {
if (numObj[s[i]]) {
numObj[s[i]]++;
} else {
numObj[s[i]] = 1;
}
}
const nums = Object.values(numObj);
const resetArr = []
nums.forEach(item => {
if (numsSet.has(item)) {
resetArr.push(item)
} else {
numsSet.add(item)
}
})
let res = 0;
for (let i = 0; i < resetArr.length; i++) {
if (resetArr[i] !== 0) {
while (numsSet.has(resetArr[i])) {
resetArr[i]--;
res++;
}
if (resetArr[i] > 0) numsSet.add(resetArr[i]);
}
}
return res;
}