首页 > 其他 > 详细

LeetCode "Maximum Product of Word Lengths"

时间:2015-12-17 06:56:01      阅读:267      评论:0      收藏:0      [点我收藏+]

Another O(n^2) solution using bit ops. We prune 1/2(expected) candidates at each bit check.

#define MAX_BITS 1600
typedef bitset<MAX_BITS> CandMask;
class Solution {
    // string to char bit mask
    uint32_t w2m(const string &s)
    {
        uint32_t ret = 0;
        for (auto c : s)
            ret |= 1 << (c - a);
        return ret;
    }
public:
    int maxProduct(vector<string>& words)
    {
        int n = words.size();

        //    Calculate masks of each word
        vector<uint32_t> wmasks;
        for (auto &s : words)
            wmasks.push_back(w2m(s));

        //    Categorize words by each bit on\off        
        vector<vector<CandMask>> recs(26, vector<CandMask>(2));
        for (int i = 0; i < n; i++)
        for (int b = 0; b < 26; b++)
        {
            if (wmasks[i] & (1 << b))   recs[b][1][i] = 1;
            else                        recs[b][0][i] = 1;
        }
    
        //
        CandMask OrigCandMask;
        for (int k = 0; k < wmasks.size(); k++)
            OrigCandMask[k] = 1;

        int ret = 0;
        for (int i = 0; i < n; i++)
        {
            uint32_t m = wmasks[i];
            int len1 = words[i].length();

            //    Binary search by bits
            CandMask candidates = OrigCandMask;
            for (int b = 0; b < 26; b++)
                if (m & (1 << b))
                    candidates &= (~recs[b][1]);
            
            for (int k = 0; k < min(n, MAX_BITS); k++)
                if (candidates[k])
                    ret = max(ret, len1 * int(words[k].length()));
        }

        return ret;
    }
};

LeetCode "Maximum Product of Word Lengths"

原文:http://www.cnblogs.com/tonix/p/5052880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!