[JavaScript 刷题] 位运算 - 最大单词长度乘积,leetcode 318
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 位运算 - 最大单词长度乘积,leetcode 318相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 位运算 - 最大单词长度乘积,leetcode 318
github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。
题目地址:318. Maximum Product of Word Lengths
题目
如下:
Given a string array
words
, return the maximum value oflength(word[i]) * length(word[j])
where the two words do not share common letters. If no such two words exist, return0
.
解题思路
-
暴力解
这种就是寻找每一个可能存在的搭配,以
words = ["abcw","baz","foo","bar","xtfn","abcdef"]
为例:abcw baz foo bar xtfn abcdef abcw x 12 x 16 x baz 9 x 12 x foo 9 x x bar 12 x xtfn x abcdef 这样的时间复杂度为 n × n × l e n ( s t r 1 ) × l e n ( s t r 2 ) n \\times n \\times len(str1) \\times len(str2) n×n×len(str1)×len(str2)
-
使用位运算
这是一个优化的方法,使用位运算后可以将时间优化为 n × n n \\times n n×n,主要是通过位运算比较两个字符串相似的时间复杂度为 1.
其原理是将每一个字母视作一个 bit,如
a
的值为0b1
,b
的值为0b10
,c
的值为0b100
,以此类推。这样
ab
的值为0b11
,比较ab
与a
吃否有重复字符就可以通过0b11 & 0b1
的方式进行比较,只要结果不为 0,那么二者就必然包含重复字母。如
ab
与c
的比较为0b11 & 0b100
,结果为0
。英文字母共有 26 个,题目中并没有要求判断公有的字母数量,只说判断是否有公用字母即可。这样 26 个字母每个分别占用一个 bit,只要
str1 & str2
的结果不为零就能够确定二者有公用的字母。
使用 JavaScript 解题
const calculateBits = (str) =>
let state = 0;
for (let i = 0; i < str.length; i++)
const num = str.charCodeAt(i);
state |= 1 << num;
return state;
;
/**
* @param string[] words
* @return number
*/
var maxProduct = function (words)
const wordsInBits = [];
for (const word of words)
wordsInBits.push(calculateBits(word));
let maxProduct = 0;
for (let i = 0; i < words.length; i++)
for (let j = i + 1; j < words.length; j++)
if ((wordsInBits[i] & wordsInBits[j]) === 0)
maxProduct = Math.max(maxProduct, words[i].length * words[j].length);
return maxProduct;
;
以上是关于[JavaScript 刷题] 位运算 - 最大单词长度乘积,leetcode 318的主要内容,如果未能解决你的问题,请参考以下文章