318. Maximum Product of Word Lengths
做题经历:
- 没有独立解出, 2016/Jul/08
其实回想起来,本题并不算很难。。但是想法非常之巧,提示使用Bit Manipulation。不过显然我没有通过这个想出结果。现在说说本题的核心想法吧。。
- 一个
Integer有32位,而字母只有26个,所以我们可以用一个Integer的对应bit的值来指代某字母是否存在,举个栗子:0x0f,对应到二进制是00001111,最底下位是1,即a,b,c,d都是存在的,其他的都不存在。该数在代码中表示为checker[i] - 判断两个字符串是否有相同的字母:
(checker[i] & checker[j]) - 然后用一个两层
for循环,就可以顺利得到答案。。
代码如下:
class Solution {
public:
int maxProduct(vector<string>& words) {
int len = words.size();
vector<int> checker(len);
for (int i = 0; i < len; ++i) {
int tmp_val = 0;
for (int j = 0; j < words[i].length(); ++j) {
tmp_val = tmp_val | (0x01 << (words[i][j] - 'a'));
}
checker[i] = tmp_val;
}
int max_product = 0;
for (int i = 0; i < len; ++i) {
for (int j = i + 1; j < len; ++j) {
if ((checker[i] & checker[j]) == 0) {
max_product = max(max_product, static_cast<int>(words[i].length() * words[j].length()));
}
}
}
return max_product;
}
};