原题目
给定一个字符串数组 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
解释: 不存在这样的两个单词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-word-lengths
题目分析
首先我们要知道每个字符串有哪几个字符,才能比较字符串之间有没有公共字符。
可以用二进制的一位表示某一个字母是否出现过,0表示没出现,1表示出现。"abcd"二进制表示00000000 00000000 00000000 00001111、"bc"二进制表示00000000 00000000 00000000 00000110。当两个字符串没有相同的字母时,二进制数与的结果为0。
这样就可以直接判断两个字符串长度乘积的大小和是否有公共元素
完整代码
int maxProduct(char ** words, int wordsSize){
int *arr=(int *)malloc(sizeof(int)*wordsSize);
for(int i=0;i<wordsSize;i++)
{
arr[i]=0;
for(int j=0;j<strlen(words[i]);j++)
{
arr[i]|=1<<(words[i][j]-'a');
}
}
int pro_max=0;
for(int i=0;i<wordsSize;i++)
for(int j=i+1;j<wordsSize;j++)
{
if((arr[i]&arr[j])==0&&pro_max<strlen(words[i])*strlen(words[j]))
{
pro_max=strlen(words[i])*strlen(words[j]);
}
}
return pro_max;
}