博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 318. Maximum Product of Word Lengths
阅读量:5886 次
发布时间:2019-06-19

本文共 2626 字,大约阅读时间需要 8 分钟。

Description

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

Example 1:

Input: ["abcw","baz","foo","bar","xtfn","abcdef"]Output: 16 Explanation: The two words can be "abcw", "xtfn".

Example 2:

Input: ["a","ab","abc","d","cd","bcd","abcd"]Output: 4 Explanation: The two words can be "ab", "cd".

Example 3:

Input: ["a","aa","aaa","aaaa"]Output: 0 Explanation: No such pair of words.

描述

给定一个字符串数组 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 解释: 不存在这样的两个单词。

思路

  • 基本思路很简单:对给定的单词两两组合,如果这两个单词没有相同的字符,记下者两个单词长度值的乘积,返回最大值。
  • 如何判断两个单词是否使用了相同的单词:我们使用位运算,整形有 32 位,字符只有 26 个。
  • 我们让二进制的数第一位表示 a ,第二位表示 b ... 第 26 位表示 z 。如果某个字母在给定的单词中出现了,我们记字母对应位置的二进制位 1 。
  • 如果两个单词没有使用相同的字母,那么这两个单词对应的二进制按位与一定为 0 ,因为两个单词没有使用相同的字母,所以二进制中的 1 都是错开的。
# -*- coding: utf-8 -*-# @Author:             何睿# @Create Date:        2019-02-23 13:14:24# @Last Modified by:   何睿# @Last Modified time: 2019-02-23 14:24:48import itertoolsclass Solution:    def maxProduct(self, words) -> int:        # bits 是字典,键为单词 word 对应的二进制码,值为一个二进制码对应的最长单词        # 最长单词:单词 a,aa,aaa,aaaa,对应的二进制码都是 0b1,为了获得最大的乘积        # 我们取最长的单词 aaaa,所以 0b1 对应 4        bits = {}        for word in words:            #  获取单词单词对应的 二进制码,有点类似哈希,但是不完全相同            bit = self.getBit(word)            # 建立键值对,这样可以避免多次 len(word)            # 值为最长单词的长度            bits[bit] = max(bits.get(bit, 0), len(word))        # 对一个列表的所有元素进行两两组合        # 也可以用循环,如 maxProduct2 中示例        # 但是在 python 中 itertools.combinations 更快        com = itertools.combinations(bits.keys(), r=2)        # 对所有组合中单词没有重复的求乘积,这里也可以写成循环的形式        # 但是在 python 中列表解析式的执行速度更快        return max([bits[x] * bits[y] for x, y in com if x & y == 0] or [0])    def maxProduct2(self, words) -> int:        res = 0        bits = [self.getBit(word) for word in words]        for i in range(len(words)):            for j in range(i + 1, len(words)):                if bits[i] & bits[j] == 0:                    res = max(res, len(words[i]) * len(words[j]))        return res    def getBit(self, word):        bit = 0        # 按位或        # 字母 a 对一二进制第 1 位,b 对应第 2 位 ... z 对应 第 26 位        for char in word:            bit = bit | (1 << (ord(char) - 97))        return bit

源代码文件在 。

©本文首发于 ,欢迎转载,转载需保留 ,作者信息和本声明.

你可能感兴趣的文章
js判断checkbox是否选中
查看>>
Eclipse中修改代码格式
查看>>
GRUB Legacy
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
文件缓存
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
MySQL查询优化
查看>>
android app启动过程(转)
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>