zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Maximum Product of Word Lengths

    Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

    Example 1:

    Given ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
    Return 16
    The two words can be "abcw", "xtfn".

    Example 2:

    Given ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
    Return 4
    The two words can be "ab", "cd".

    Example 3:

    Given ["a", "aa", "aaa", "aaaa"]
    Return 0
    No such pair of words.

     
     
     
     

     
     
     

    最直接的想法,两两比较,算出最大值。

    其中比较的操作要做n^2次,只能用效率高的位运算。

    先遍历一遍words,把单词转成二进制的数。

    a对应2的0次,b对应2的1次,以此类推。

    z y ... d c b a
    2^25 2^24 ... 4 2 1 0

    比较两个单词是不是包含重复字母的时候,只需要用&运算看结果是否为0。

     1 /**
     2  * @param {string[]} words
     3  * @return {number}
     4  */
     5 var maxProduct = function(words) {
     6     var i, j, max = 0;
     7     var bitDict = [];
     8     for(i = 0; i < words.length; i++)
     9         bitDict[i] = word2Num(i);
    10     for(i = 0; i < words.length; i++)
    11         for(j = 0; j < words.length; j++)
    12             if(i !== j && !hasSharedLetter(i, j))
    13                 max = Math.max(max, words[i].length * words[j].length);
    14     return max;
    15 
    16     function word2Num(index){
    17         var res = 0, charCodeA = 'a'.charCodeAt();
    18         for(var i = 0 ; i < words[index].length; i++)
    19             res |= Math.pow(2, words[index][i].charCodeAt() - charCodeA);
    20         return res;
    21     }
    22     function hasSharedLetter(index1, index2){
    23         if((bitDict[index1] & bitDict[index2]) === 0) return false;
    24         return true;
    25     }
    26 };
  • 相关阅读:
    linux awk命令详解
    Linux 大页面使用与实现简介(转)
    二层设备与三层设备的区别--总结
    Windows下的cd命令
    linux常用命令
    上班第一天
    linux 内核移植和根文件系统的制作
    Sizeof与Strlen的区别与联系
    嵌入式软件工程师面试题
    SpringBoot简单打包部署(附工程)
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5061408.html
Copyright © 2011-2022 走看看