if 0
给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。
假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。
示例 1:
输入: words = [“abcw”, “baz”, “foo”, “bar”, “fxyz”, “abcdef”]
输出 : 16
解释 : 这两个单词为 “abcw”, “fxyz”。它们不包含相同字符,且长度的乘积最大。
示例 2 :
输入 : words = [“a”, “ab”, “abc”, “d”, “cd”, “bcd”, “abcd”]
输出 : 4
解释 : 这两个单词为 “ab”, “cd”。
示例 3 :
输入 : words = [“a”, “aa”, “aaa”, “aaaa”]
输出 : 0
解释 : 不存在这样的两个单词。
#endif
#include <iostream>
#include <vector>
using std::vector;
using std::string;
int maxProduct(vector<string>& words) {
int n = words.size();
int* masks = new int[n];
memset(masks, 0, sizeof(int)*n );
int* lens = new int[n];
//预先计算和长度
for (int i = 0; i < n; ++i)
{
for (char c : words[i])
{
masks[i] |= 1 << (c - 'a'); //这一句是将所有掩码取得
}
lens[i] = words[i].size();
}
//保存最大的乘积
int res = 0;
//两层遍历
int curr = 0;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
curr = lens[i] * lens[j];
if (curr > res)
{
// std::cout<<curr<<" "<<i<<","<<j<<" "<<(masks[i]& masks[j])<<std::endl;
if ((masks[i] & masks[j]) == 0)
res = curr;
}
}
}
return res;
}
int main()
{
vector<string> words{ "abcw", "baz", "foo", "bar", "fxyz", "abcdef" };
std::cout<<maxProduct(words);
}