[路飞]字符频次唯一的最小删除次数

142 阅读1分钟

记录 1 道算法题

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

leetcode-cn.com/problems/mi…


要求:给一个字符串,里面的相同字母的个数不能相同。如果相同要进行删除,直到个数不相同。返回删除的个数。

比如: '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
    }