[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 of length(word[i]) * length(word[j]) where the two words do not share common letters. If no such two words exist, return 0.

解题思路

  1. 暴力解

    这种就是寻找每一个可能存在的搭配,以 words = ["abcw","baz","foo","bar","xtfn","abcdef"] 为例:

    abcwbazfoobarxtfnabcdef
    abcwx12x16x
    baz9x12x
    foo9xx
    bar12x
    xtfnx
    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)

  2. 使用位运算

    这是一个优化的方法,使用位运算后可以将时间优化为 n × n n \\times n n×n,主要是通过位运算比较两个字符串相似的时间复杂度为 1.

    其原理是将每一个字母视作一个 bit,如 a 的值为 0b1b 的值为 0b10c 的值为 0b100,以此类推。

    这样 ab 的值为 0b11,比较 aba 吃否有重复字符就可以通过 0b11 & 0b1 的方式进行比较,只要结果不为 0,那么二者就必然包含重复字母。

    abc 的比较为 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的主要内容,如果未能解决你的问题,请参考以下文章

刷题向》一道关于位运算的神题(BZOJ3668)(HARD)

Leetcode刷题之位运算(Java)

Leetcode刷题之位运算(Java)

刷题疑惑2

算法刷题AcWing 90. 64位整数乘法——位运算

刷题Flag Day 1