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.

Rust Solution

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');
            }
            let size = hm.entry(mask).or_default();
            *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);
}

Having problems with this solution? Click here to submit an issue on github.