题目

类型:位运算
image.png

解题思路

遍历字符串数组 words 中的每一对单词,判断这一对单词是否有公共字母,如果没有公共字母,则用这一对单词的长度乘积更新最大单词长度乘积。
使用位运算预处理每个单词,通过位运算操作判断两个单词是否有公共字母。
用数组 masks 记录每个单词的位掩码表示。计算数组 masks 之后,判断第 i 个单词和第 j 个单词是否有公共字母可以通过判断 masks[i] & masks[j] 是否等于 0 实现,当且仅当 masks[i] & masks[j]=0 时第 i 个单词和第 j 个单词没有公共字母,此时使用这两个单词的长度乘积更新最大单词长度乘积。

代码

  1. class Solution {
  2. public int maxProduct(String[] words) {
  3. int length = words.length;
  4. int[] masks = new int[length];
  5. for (int i = 0; i < length; i++) {
  6. String word = words[i];
  7. int wordLength = word.length();
  8. for (int j = 0; j < wordLength; j++) {
  9. masks[i] |= 1 << (word.charAt(j) - 'a');
  10. }
  11. }
  12. int maxProd = 0;
  13. for (int i = 0; i < length; i++) {
  14. for (int j = i + 1; j < length; j++) {
  15. if ((masks[i] & masks[j]) == 0) {
  16. maxProd = Math.max(maxProd, words[i].length() * words[j].length());
  17. }
  18. }
  19. }
  20. return maxProd;
  21. }
  22. }