zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    整套的操作体系:三点看股法
    [Garmin]安卓版本2.35完美安装程序+地图+JVC+电子眼
    [Garmin]安卓版本2.35完美安装程序+地图+JVC+电子眼
    [凯立德]2015春季版C2739-M7L83-3521JON,已O+带3D+带路况
    [凯立德]2015春季版C2739-M7L83-3521JON,已O+带3D+带路况
    DirectX9:总结篇 异常错误检测
    Linux开发:论ffmpeg的使用
    VS的bug集锦
    牛客:脑筋急转弯的选择题
    剑指Offer:栈的压入/弹出序列
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5300341.html
Copyright © 2011-2022 走看看