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.
想到String的char 查重,最好的方法就是用bit manipulation
注意O(N^2)的iteration里面可以适当pruning
1 public class Solution { 2 public int maxProduct(String[] words) { 3 if (words==null || words.length==0) return 0; 4 int max = 0; 5 int[] bitmasks = new int[words.length]; 6 Arrays.sort(words, new Comparator<String>(){ 7 public int compare(String s1, String s2) { 8 return s2.length()-s1.length(); 9 } 10 }); 11 12 for (int i=0; i<words.length; i++) { 13 for (int j=0; j<words[i].length(); j++) { 14 bitmasks[i] |= 1<<((int)(words[i].charAt(j) - 'a')); 15 } 16 } 17 18 for (int i=0; i<words.length-1; i++) { 19 for (int j=i+1; j<words.length; j++) { 20 if (words[i].length() * words[j].length() <= max) break; //pruning 21 if ((bitmasks[i] & bitmasks[j]) != 0) continue; 22 max = words[i].length() * words[j].length(); 23 break;//pruning 24 } 25 } 26 return max; 27 } 28 }