算法设计与分析—最大单词长度乘积(二进制)

LeetCode题目练习:

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

示例 1:
输入: [“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”]
输出: 16
解释: 这两个单词为 “abcw”, “xtfn”。

示例 2:
输入: [“a”,“ab”,“abc”,“d”,“cd”,“bcd”,“abcd”]
输出: 4
解释: 这两个单词为 “ab”, “cd”。

示例 3:
输入: [“a”,“aa”,“aaa”,“aaaa”]
输出: 0
解释: 不存在这样的两个单词。

来源:力扣(LeetCode)
a) 算法思路
1、二重循环依次判断每个单词
2、比较两个单词是否相似,成绩是否最大
难点:
难点1、如何比较两个单词是否相似:
方法一:暴力解法
遍历第一个单词使用hash表或者数组存储对应的字母,遍历第二个单词,只要有和第一个单词重复的字母就返回False
方法二:二进制存储法(较为巧妙)
将a,b,c···z 以二进制的形式依次映射到int中
难点2、如何循环判断所有的单词
将上述每个单词对应的二进制映射存到列表中,方便循环时进行判断。
循环采用暴力方法,双重循环依次判断所有的单词。

图片来自(彤哥来刷题啦)
请添加图片描述

代码

def maxProduct(self, words):
     """
     :type words: List[str]
     :rtype: int
     """
     word_list=[]
     for word in words:
         _int=0
         for c in word:
             _int|=1<<(ord(c)-97)
         word_list.append(_int)
     max_len=0
     length=len(words)
     for i in range(length):
         for j in range(i+1,length):
             if(word_list[i]&word_list[j])==0:
                 mul=len(words[i])*len(words[j])
                 if max_len<mul:
                     max_len=mul
     return max_len

猜你喜欢

转载自blog.csdn.net/qq_39740279/article/details/121377593