LeetCode 318. Maximum Product of Word Lengths
Posted wolfpack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 318. Maximum Product of Word Lengths相关的知识,希望对你有一定的参考价值。
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.
思路:
1.需要找到有效的方法来比较字符串中是否含有相同的元素。 (bitmask)
2.找到这种方法之后,直接遍历整个数组找最大的乘积就得出解了。(brute force)
Code:
1 #include <vector> 2 #include <string> 3 using namespace std; 4 int maxProduct(vector<string>& words) { 5 int res = 0, n = words.size(); 6 vector<int> charBits(n, 0); 7 for (int i = 0; i < n; i++) { 8 charBits[i] = 0; 9 for (int j = 0; j < words[i].size(); j++) { 10 charBits[i] |= 1 << (words[i][j] - ‘a‘); 11 } 12 } 13 14 for (int i = 0; i < n; i++) { 15 for (int j = 0; j < n; j++) { 16 if ((charBits[i] & charBits[j]) == 0) { 17 int product = words[i].size() * words[j].size(); 18 if (res < product) { 19 res = product; 20 } 21 } 22 } 23 } 24 return res; 25 }
详细解释:
Part1:
第10行代码:
//bitmask: bit operation,move "0x0001" left "(words[i][j] - ‘a‘)" bits; this way we can store different characters in charBits[i]
charBits[i] |= 1 << (words[i][j] - ‘a‘);
从‘a‘到‘z‘一共有26个字母,一个int变量有32bit,每个字母与‘a‘相减得到的值(即0x0001需要左移的位置)不会超出int变量的范围。
通过将0x0001(即1)左移 “ words[i][j] - ‘a‘ ”位,我们将字母words[i][j]的信息存储在了位操作后的int数字上。(注意:即使存在重复的字母,也不会有影响。因为我们要存储的不是字符串的全部信息,仅仅是单词中所有不同字母的信息)
然后再通过 “|=”操作,将单词words[i]的j位置的字母words[i][j]存到变量charBits[i](即bitmask)中。
遍历整个单词,即可得到整个字符串的bitmask:charBits[i]。
遍历完整个words之后,我们就得到了每个单词words[i]的bitmask。
Part2:
之后在第16行代码中:
if ((charBits[i] & charBits[j]) == 0) {
将不同单词words[i]和words[j]的bitmask(charBits[i]和charBits[j]),作&运算,只要不等于0,就说明两个单词有相同的字母。
一旦(charBits[i] & charBits[j]) == 0,则说明两个单词没有任何相同的字母。
延伸:
1.题设中的条件是只有小写字母,如果有大写字母怎么办?
答:用long或者bit[64]来存储字母的信息。
char c = words[i][j] if (islower(c) { charBits[i] |= (long)1 << ( c - ‘a‘); } else { charBits[i] |= (long)1 << (( c - ‘A‘)+32); }
以上是关于LeetCode 318. Maximum Product of Word Lengths的主要内容,如果未能解决你的问题,请参考以下文章
318. Maximum Product of Word Lengths
Leetcode 318. Maximum Product of Word Lengths
Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算
318. Maximum Product of Word Lengths