Python解LeetCode 318: Maximum Product of Word Lengths

提供两种解法,第一种利用Python内置的set类型判断两个单词是否有重叠字符,复杂度高,无法通过全部测试;第二种方法使用位运算判断两个单词是否存在重叠字符,复杂度有所降低,可通过全部测试,但是运行时间排名也比较靠后。下述两种答案仅供参考交流,仍有很大的改进空间。

第一种解法:

from itertools import permutations

class Solution(object):
	def maxProduct(self, words):
	"""
	:type words: List[str]
	:rtype: int
	"""
	result = 0
	words = sorted(words, key=lambda item: len(item), reverse=True)
	for w1, w2 in permutations(words, 2):
		if not set(w1) & set(w2):
			result = max(result, len(w1) * len(w2))
	return result

本方法利用了set类型的计算特性和内置函数permutations

第二种解法:

import string
from itertools import permutations

class Solution(object):
	def maxProduct(self, words):
		"""
		:type words: List[str]
		:rtype: int
		"""
		# 预计算每个字母的二进制表示
		char_bin_dic = {}
		for char in list(string.ascii_lowercase):
			offset = ord(char) - ord('a')
			char_bin_dic[char] = (1 << offset)
		masks = {}
		# 预计算每个词的二进制表示
		for word in words:
			word_bin = 0
			for char in word:
				char_bin = char_bin_dic[char]
				word_bin = word_bin | char_bin
			masks[word] = word_bin

		result = 0
		for w1, w2 in permutations(words, 2):
			if masks[w1] & masks[w2] == 0:
				result = max(result, len(w1) * len(w2))

		return result

这种方法主要使用了位操作,减少了比较两个单词是否有重叠字符的复杂度,需要熟悉二进制位运算,并且能够灵活运用。

参考资料:

[1] Python 位操作(Bitwise Operation) 详解
[2] Python中的整型占多少个字节?
[3] LeetCode 318中文题解

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页