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

  1. #include <iostream>
  2. #include <vector>
  3. using std::vector;
  4. using std::string;
  5. int maxProduct(vector<string>& words) {
  6. int n = words.size();
  7. int* masks = new int[n];
  8. memset(masks, 0, sizeof(int)*n );
  9. int* lens = new int[n];
  10. //预先计算和长度
  11. for (int i = 0; i < n; ++i)
  12. {
  13. for (char c : words[i])
  14. {
  15. masks[i] |= 1 << (c - 'a'); //这一句是将所有掩码取得
  16. }
  17. lens[i] = words[i].size();
  18. }
  19. //保存最大的乘积
  20. int res = 0;
  21. //两层遍历
  22. int curr = 0;
  23. for (int i = 0; i < n; ++i)
  24. {
  25. for (int j = i + 1; j < n; ++j)
  26. {
  27. curr = lens[i] * lens[j];
  28. if (curr > res)
  29. {
  30. // std::cout<<curr<<" "<<i<<","<<j<<" "<<(masks[i]& masks[j])<<std::endl;
  31. if ((masks[i] & masks[j]) == 0)
  32. res = curr;
  33. }
  34. }
  35. }
  36. return res;
  37. }
  38. int main()
  39. {
  40. vector<string> words{ "abcw", "baz", "foo", "bar", "fxyz", "abcdef" };
  41. std::cout<<maxProduct(words);
  42. }