记录 1 道算法题
最大单词长度乘积
要求:提供一个数组,返回数组内最大的两个没有重复字母的长度乘积,如果不存在则返回 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
}