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);}
