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:

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

Example 2:

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

Example 3:

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

Constraints:

• `0 <= words.length <= 10^3`
• `0 <= words[i].length <= 10^3`
• `words[i]` consists only of lowercase English letters.

318. Maximum Product of Word Lengths
``````struct Solution;
use std::collections::HashMap;

impl Solution {
fn max_product(words: Vec<String>) -> i32 {
let mut hm: HashMap<u32, usize> = HashMap::new();
for word in words {
let mut mask: u32 = 0;
for c in word.bytes() {
mask |= 1 << (c - b'a');
}
*size = word.len().max(*size);
}
let mut res = 0;
for (&ka, &va) in &hm {
for (&kb, &vb) in &hm {
if ka & kb == 0 {
res = res.max(va * vb);
}
}
}
res as i32
}
}

#[test]
fn test() {
let words = vec_string!["abcw", "baz", "foo", "bar", "xtfn", "abcdef"];
let res = 16;
assert_eq!(Solution::max_product(words), res);
let words = vec_string!["a", "ab", "abc", "d", "cd", "bcd", "abcd"];
let res = 4;
assert_eq!(Solution::max_product(words), res);
let words = vec_string!["a", "aa", "aaa", "aaaa"];
let res = 0;
assert_eq!(Solution::max_product(words), res);
}
``````