318. Maximum Product of Word Lengths

做题经历:

  1. 没有独立解出, 2016/Jul/08

其实回想起来,本题并不算很难。。但是想法非常之巧,提示使用Bit Manipulation。不过显然我没有通过这个想出结果。现在说说本题的核心想法吧。。

  1. 一个Integer32位,而字母只有26个,所以我们可以用一个Integer的对应bit的值来指代某字母是否存在,举个栗子: 0x0f,对应到二进制00001111,最底下位是1,即a, b, c, d都是存在的,其他的都不存在。该数在代码中表示为checker[i]
  2. 判断两个字符串是否有相同的字母: (checker[i] & checker[j])
  3. 然后用一个两层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;
    }
};

results matching ""

    No results matching ""