Description
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.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
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.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
Highlights
其中闪光的地方可以理解成将单词所含有的字母转化成为26位二进制表示。
(How to change word to byte if you want to describe whether the word contain the certain letter?
Word ---> 26 bits binary )
技术细节:
数组的长度length是作为数组的属性存在的,a.length
字符串的长度length是作为其自身的方法存在的,也即a.length()
Answer Code
public class Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] num = new int[n];
int ans = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < words[i].length(); j++){
num[i] |= (1 << (words[i].charAt(j) - 'a'));
}
}
for (int i = 0; i < n; i++){
for (int j = i + 1; j < n; j++)
if ((num[i] & num[j]) == 0) ans = Math.max(ans, words[i].length() * words[j].length());
}
return ans;
}
}