318. Maximum Product of Word Lengths

Posted YRB

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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.

链接: https://leetcode.com/problems/maximum-product-of-word-lengths/

题解:

给定一个String array,求出不含相同字符的两个单词长度乘积的最大值。

我们可以把这道题目分为几个步骤。 

  1. 双重循环遍历Words
  2. 先把words[i]和words[j]放入一个<String, Set<Character>>的HashMap里
  3. 比较两者是否有重复, 假如没有重复,我们可以尝试更新max, 否则continue
  4. 最后返回max

这里题目给出单词只包含小写字母,所以我们还可以进一步优化空间复杂度。 另外,预先对数组按长度进行排序的话应该可以剪枝掉不少计算。 留给二刷了。

Java:

Time Complexity - O(n ^2), Space Complexity - O(n)

public class Solution {
    public int maxProduct(String[] words) {
        if (words == null || words.length < 2) {
            return 0;
        }
        int max = 0;
        Map<String, Set<Character>> map = new HashMap<>();
        
        for (int i = 0; i < words.length; i++) {
            addToMap(words[i], map);
            for (int j = i + 1; j < words.length; j++) {
                addToMap(words[j], map);
                if (!hasSameChar(words[i], words[j], map)) {
                    max = Math.max(max, words[i].length() * words[j].length());
                }
            }
        }
        return max;
    }
    
    private void addToMap(String word, Map<String, Set<Character>> map) {
        if (!map.containsKey(word)) {
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < word.length(); i++) {
                set.add(word.charAt(i));
            }
            map.put(word, set);
        }
    }
    
    private boolean hasSameChar(String word1, String word2, Map<String, Set<Character>> map) {
        Set<Character> set1 = map.get(word1);
        Set<Character> set2 = map.get(word2);
        for (Character c : set1) {
            if (set2.contains(c)) {
                return true;
            }
        }
        return false;
    }
}

 

Reference:

https://leetcode.com/discuss/74589/32ms-java-ac-solution

以上是关于318. Maximum Product of Word Lengths的主要内容,如果未能解决你的问题,请参考以下文章

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

LeetCode 318. Maximum Product of Word Lengths