318-maximum-product-of-word-lengths

Try it on leetcode

Description

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.

 

Example 1:

Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".

Example 2:

Input: words = ["a","ab","abc","d","cd","bcd","abcd"]
Output: 4
Explanation: The two words can be "ab", "cd".

Example 3:

Input: words = ["a","aa","aaa","aaaa"]
Output: 0
Explanation: No such pair of words.

 

Constraints:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] consists only of lowercase English letters.

Solution(Python)

class Solution:
    def maxProduct(self, words: List[str]) -> int:
        return self.optimal(words)

    # Time Complexity: O(n^2*L)
    # Space Complexity: O(L)
    def bruteforce(self, words: List[str]) -> int:
        max_value = 0

        for i, word1 in enumerate(words):
            for j, word2 in enumerate(words[i:]):
                if set(word1) ^ set(word2) == set(word1 + word2):
                    value = len(word1) * len(word2)
                    if value > max_value:
                        max_value = value
        return max_value

    # Time Complexity: O(n^2)
    # Space Complexity: O(n)
    def optimal(self, words: List[str]) -> int:
        bits = [0 for i in range(len(words))]
        max_value = 0

        for i in range(len(words)):
            for c in words[i]:
                bits[i] |= 1 << (ord(c) - 97)

        for i in range(len(bits)):
            for j in range(i + 1, len(bits)):
                if (bits[i] & bits[j]) == 0:
                    value = len(words[i]) * len(words[j])
                    if value > max_value:
                        max_value = value
        return max_value