您的位置:首页 > 编程语言 > Python开发

leetcode 318. Maximum Product of Word Lengths-最长单词积|位运算

2016-05-23 22:17 543 查看
原题链接:318. Maximum Product of Word Lengths
【思路-Java、Python】

本题的妙处在于用一个 int 值就能表示26个字母,哪些字母在单词中出现过,哪些字母没有在单词中出现过。我们知道一个 int 值有32位,小写字母总共有26位,32位的 int 值足够用每一位表示26位字母是否在单词中出现。假设字母 a 可以映射为第0位,b可以映射为第1位,...,z 可以映射为第25位,那么假设对于 int 为5的数字,在二进制中第0位和第2位为1,其他位都为0,这就代表字母 a 和 c 出现过:

public class Solution {
public int maxProduct(String[] words) {
int len = words.length;
int[] table = new int[len];  //table[i]用于存储 words[i] 中存现哪些小写字母
int maxLen = 0;  //记录最大长度
for (int i = 0; i < len; i++)
for (int j = 0; j < words[i].length(); j++)
table[i] |= 1 << words[i].charAt(j) - 'a';  //将出现的字母映射到 int 相应的那一位,并将那一位置为1
for (int i = 0; i < len; i++)
for (int j = i + 1; j < len; j++)
if ((table[i] & table[j]) == 0)  //①
maxLen = Math.max(maxLen, words[i].length() * words[j].length());
return maxLen;
}
}


class Solution(object):
def maxProduct(self, words):
"""
:type words: List[str]
:rtype: int
"""
table = []
maxLen = 0
for i in range(len(words)) :
table.append(reduce(lambda x,y : x|1<<(ord(y)-ord('a')),[ j for j in words[i]], 0))
for i in range(len(words)) :
for j in range(i+1,len(words)) :
if table[i] & table[j] == 0 and maxLen < len(words[i])*len(words[j]):  //②
maxLen = len(words[i])*len(words[j])
return maxLen
174 / 174 test
cases passed. Runtime: 992
ms  Your runtime beats 60.08% of pythonsubmissions.

上面的 Java 和 Python 的代码中我们还得注意一点小小的区别,①和②两行。在 Java 中,位运算的优先级低于判断运算符,而在 Python 中位运算的优先级却高于判断运算符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python Java leetcode