LC318.最大单词长度乘积

原题链接
image.png

思路:位运算

  • 位运算:实现O(1)时间判断两个字符串是否有公共字母
  • 将每个字母转化成对应的数字,对应位置标记为1,逐个左移即可。

    1. // 两个字符串是否包含公共字母,操作复杂度可以降到O(1)
    2. vector<int> nums;
    3. for (int i = 0, n = words.size(); i < n; ++i) {
    4. int cur_num = 0;
    5. for (int j = 0, len = words[i].size(); j < len; ++j) {
    6. cur_num |= (1<< (words[i][j] - 'a'));
    7. }
    8. nums.push_back(cur_num);
    9. }
  • 判断两个字符串是不是有公共字母,只需要进行与运算即可。

    代码

  1. class Solution {
  2. public:
  3. int maxProduct(vector<string>& words) {
  4. // 两个字符串是否包含公共字母,操作复杂度可以降到O(1)
  5. vector<int> nums;
  6. for (int i = 0, n = words.size(); i < n; ++i) {
  7. int cur_num = 0;
  8. for (int j = 0, len = words[i].size(); j < len; ++j) {
  9. cur_num |= (1<< (words[i][j] - 'a'));
  10. }
  11. nums.push_back(cur_num);
  12. }
  13. int max_len = 0;
  14. for (int i = 0, n = words.size(); i < n; ++i) {
  15. for (int j = i + 1; j < n; ++j) {
  16. if ((nums[i] & nums[j]) == 0) {
  17. max_len = max(max_len, int(words[i].size() * words[j].size())) ;
  18. }
  19. }
  20. }
  21. return max_len;
  22. }
  23. };