Bit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public int maxProduct(String[] words) { int maxProduct = 0;
int[] masks = new int[words.length]; for (int i = 0; i < words.length; i++) { String word = words[i]; for (int j = 0; j < word.length(); j++) { masks[i] |= (1 << (word.charAt(j) - 'a')); } }
for (int i = 0; i < masks.length; i++) { for (int j = i + 1; j < masks.length; j++) { if ((masks[i] & masks[j]) == 0) { maxProduct = Math.max(maxProduct, words[i].length() * words[j].length()); } } }
return maxProduct; } }
|
Bit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public int maxProduct(String[] words) { int maxProduct = 0;
Map<Integer, Integer> maskToMaxLengthMap = new HashMap<>(); for (String word : words) { int mask = 0; for (int j = 0; j < word.length(); j++) { mask |= (1 << (word.charAt(j) - 'a')); } Integer prevLength = maskToMaxLengthMap.get(mask); if (prevLength == null || word.length() > prevLength) { maskToMaxLengthMap.put(mask, word.length()); } }
Integer[] masks = maskToMaxLengthMap.keySet().toArray(new Integer[0]); for (int i = 0; i < masks.length; i++) { for (int j = i + 1; j < masks.length; j++) { if ((masks[i] & masks[j]) == 0) { maxProduct = Math.max(maxProduct, maskToMaxLengthMap.get(masks[i]) * maskToMaxLengthMap.get(masks[j])); } } }
return maxProduct; } }
|
References
318. Maximum Product of Word Lengths
剑指 Offer II 005. 单词长度的最大乘积