[路飞]最大单词长度乘积

100 阅读1分钟

记录 1 道算法题

最大单词长度乘积

318. 最大单词长度乘积 - 力扣(LeetCode)


要求:提供一个数组,返回数组内最大的两个没有重复字母的长度乘积,如果不存在则返回 0。比如:words = ["abcw","baz","foo","bar","xtfn","abcdef"],输出:16。

双循环将单词配对比较即可。单词的重复字母比较可以使用位掩码

将26个英文单词用长度为26的二进制,对应的字母为 1,这样做与运算的时候,只有两者完全不一样才会得到 0。

完整代码如下:

    function maxProduct(words) {
        const map = new Map()
        for(let i = 0; i < words.length; i++) {
            const w = words[i]
            let mask = 0
            // 遍历单词的字母
            for(let j = 0; j < w.length; j++) {
                // 字母的偏移位做或运算,保存到 mask 中,标记这个字母为 1。
                mask |= 1 << (w[j].charCodeAt() - 'a'.charCodeAt())
            }
            // 因为拥有的字母种类相同,无论多少长度,计算出的位掩码是一样的,所以保存最长的那个单词长度即可。
            if (w.length > (map.get(mask) || 0)) {
                map.set(mask)
            }
        }
        // 把位掩码取出来进行比较
        let res = 0
        const maskSet = Array.from(map.keys())
        for(let a of maskSet) {
            for(let b of maskSet) {
                // 只有两个没有重复字母的单词才能为 0。
                if ((a & b) === 0) {
                    // 取最大的单词长度乘积
                    res = Math.max(res, map.get(a) * map.get(b))
                } 
            }
        }
        
        return res
    }