给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。
示例 1:
输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "xtfn"。
示例 2:
输入: ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4
解释: 这两个单词为 "ab", "cd"。
示例 3:
输入: ["a","aa","aaa","aaaa"]
输出: 0
解释: 不存在这样的两个单词。
第一种常规思路:可以通过遍历每次比较的两个字符串是否存在相同字符。这样比较耗时。
class Solution {
public boolean compareExistCommon(String a,String b)
{
char[] a1 = a.toCharArray();
char[] b1 = b.toCharArray();
for(int i = 0;i < a.length();++i)
{
for(int j = 0;j < b.length();++j)
{
if(a1[i] == b1[j])
return false;
}
}
return true;
}
public int maxProduct(String[] words) {
int len = words.length;
int maxx = 0;
for(int i = 0;i < len;++i)
{
for(int j = i+1;j < len;++j)
{
if(compareExistCommon(words[i],words[j]))
{
if(words[i].length()*words[j].length() > maxx)
maxx = words[i].length()*words[j].length();
}
}
}
return maxx;
}
}
第二种思路:是否可以通过二进制的方式来表示一个字符串存在哪些字符,然后把两个字符串的二进制表示进行与运算,如果不为0,则表示存在共同字符。如abc,表示为二进制:00000000 00000000 00000000 00000111。bc表示为00000000 00000000 00000000 00000110。
class Solution{
public int maxProduct(String[] words) {
int wlength = words.length;
int arr[] = new int[wlength+10];
for(int i = 0;i < wlength;++i)
{
int len = words[i].length();
for(int j = 0;j < len;++j)
{
arr[i] |= 1<<(words[i].charAt(j)-'a');
}
}
int ans = 0;
for(int i = 0;i < wlength;++i)
{
for(int j = i+1;j < wlength;++j)
{
if((arr[i]&arr[j]) == 0)
{
int k = words[i].length() * words[j].length();
ans = ans < k ? k : ans;
}
}
}
return ans;
}
}