leetcode 318. 最大单词长度乘积

  1. 题目链接 https://leetcode-cn.com/problems/maximum-product-of-word-lengths/comments/

  2. 题目描述

    1. 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。
    2. 示例 1:

      输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
      输出: 16 
      解释: 这两个单词为 "abcw", "xtfn"

      示例 2:

      输入: ["a","ab","abc","d","cd","bcd","abcd"]
      输出: 4 
      解释: 这两个单词为 "ab", "cd"
  3. 解题思路

    1. 想不到更好的方法,直接上暴力了 - -。直接遍历两边数组,对每对单词都判断一下。
    2. 根据题目要求,只有无公共字母的单词对才可以计算。自然想到用集合的与操作来判断是否符合要求。考虑到只有26个字母,即集合的元素有限。我们可以用二进制代替集合,来优化代码。
    3. 这里有个神奇的现象: 若果两个数不存在同为1的位,那么两个数的与操作后的结果等于异或后的结果。比如1010和0100, 1010 | 0100 为 1110 ,1010^0100为1110。
  4. 代码

    1. python
      class Solution:
          def maxProduct(self, words: List[str]) -> int:
              res = 0
              ASC = []
              for word in words:
                  tmp = 0
                  for s in word:
                      tmp |= 1 << (ord(s) - 97)
                  ASC.append([tmp, len(word)])
              
              for i in range(len(words)-1):
                  for j in range(i+1, len(words)):
                      if ASC[i][0] | ASC[j][0] ==  ASC[i][0] ^ ASC[j][0]:
                          res = max(res, ASC[i][1] * ASC[j][1])
      
              return res
                      

       

你可能感兴趣的:(刷题,leetcode题解)