记录 1 道算法题
字符频次唯一的最小删除次数
要求:给一个字符串,里面的相同字母的个数不能相同。如果相同要进行删除,直到个数不相同。返回删除的个数。
比如: 'bbacdefcaa'
, 输出 3。
使用计数的方法。因为次数不能重复,所以需要对次数进行记录。由于只有26个字母,所以可以直接用一个长度是26的数组记录次数。
如果判断到这个次数存在,需要次数 + 1,然后继续判断次数-1是否存在。直到是零为止。
function arrayPairSum(s) {
let count = 0
const a = 'a'.charCodeAt(0)
const map = Array(26).fill(0)
// 记录次数 26 个字母 26 个下标
for(let i = 0; i < s.length; i++) {
const k = s[i].charCodeAt(0)
map[k - a]++
}
// 记录次数,去重
const set = new Set()
let result = 0
for(let i = 0; i < map.length; i++) {
const c = map[i]
// 当次数不是 0,并且已经记录过,那就是重复,要找到不是重复的次数
while(c > 0 && set.has(c)) {
c--
result++
}
// 记录当前次数
set.add(c)
}
return result
}