318. Maximum Product of Word Lengths

Medium
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.

解題

func maxProduct(words []string) int {
m := make(map[int]int)
ans := 0
​
for _, word := range words {
mask := 0
for i := 0; i < len(word); i++ {
mask |= 1 << (word[i] - 'a');
}
m[mask] = max(m[mask], len(word))
​
for k, v := range m {
if mask & k == 0 {
ans = max(ans, len(word) * v)
}
}
}
​
return ans
}
​
func max(a, b int) int {
if a > b { return a }
return b
}