LeetCode-Maximum Product of Word Lengths

Description:

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.

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

题目大意:找出不包含相同字母的单词长度乘积的最大值

思路:最容易想到的办法应该是3层循环枚举,找出最大值,复杂度是O(n^2*k),k为单词的长度。在此基础上优化,优化判断两个单词是否包含相同字母部分,可以使用26位的整数来表示单词的字母情况,每个字母在这个整数的二进制数中都有一个位置,如果为1代表包含这个字母,否则相反。再通过两个整数按位与来判断是否包含相同字母,如果不包含相同字母则两个整数的二进制数中必然没有对应位置都为1的位,则按位与后得0。这样优化之后复杂度变为O(n^2)。还可以再优化,可以预先把字符串数组按长度降序排序,这样在寻找最大乘积的时候就可以尽早的找到,不做过多的计算。但是这种优化不是一定能提高效率的,因为如果遇到最后的结果是比较小的情况,并不能避免大量的计算,还增加了排序的开销。

含有排序优化的实现代码:

public class Solution {
    public int maxProduct(String[] words) {
        int[] map = new int[words.length];

        //长度由大到小排序
        Arrays.sort(words, new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s2.length() - s1.length();
            }
        });

        //用26位整数记录包含字母的情况
        for(int i=0; i<words.length; i++) {
            int bit = 0;
            for(int j=0; j<words[i].length(); j++) {
                bit |= (1 << words[i].charAt(j) - ‘a‘);
            }
            map[i] = bit;
        }

        int max = 0;
        //找出满足条件的最大乘积
        for(int i=0; i<words.length; i++) {
            if(words[i].length()*words[i].length() <= max) break; //往后没有更大的了
            for(int j=i+1; j<words.length; j++) {
                if((map[i] & map[j]) == 0) { //没有相同的字母
                    max = Math.max(max, words[i].length() * words[j].length()); //一次循环中最大的
                    break;
                }
            }
        }
        return max;
    }
}

时间: 2024-10-16 06:37:08

LeetCode-Maximum Product of Word Lengths的相关文章

Maximum Product of Word Lengths

Maximum Product of Word Lengths Total Accepted: 750 Total Submissions: 2060 Difficulty: Medium 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 tha

Maximum Product of Word Lengths -- LeetCode

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

leetcode笔记: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.

leetcode 318: 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

【leetcode】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

Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算

先介绍下本题的题意: 在一个字符串组成的数组words中,找出max{Length(words[i]) * Length(words[j]) },其中words[i]和words[j]中没有相同的字母,在这里字符串由小写字母a-z组成的. 对于这道题目我们统计下words[i]的小写字母a-z是否存在,然后枚举words[i]和words[j],找出max{Length(words[i]) * Length(words[j]) }. 小写字母a-z是26位,一般统计是否存在我们要申请一个bool

318. 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. Exa

318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示

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

318. Maximum Product of Word Lengths java solutions

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

318 Maximum Product of Word Lengths 最大单词长度乘积

给定一个字符串数组words,找到length(word[i]) * length(word[j])的最大值,并且两个单词不含公共的字母.你可以认为每个单词只包含小写字母.如果不存在这样的两个单词,返回 0.示例 1:输入 ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]返回 16两个单词可以为 "abcw", "