Leetcode 318. 最大单词长度乘积

原题链接:Leetcode 318. 最大单词长度乘积
Leetcode 318. 最大单词长度乘积_第1张图片
自己写的代码 哈希:

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int n=words.size();
        int res=0;
        vector<vector<int>> v(n,vector<int>(26));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<words[i].size();j++)
            {
                int tmp=words[i][j]-'a';
                v[i][tmp]=1;
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int f=1;
                for(int k=0;k<words[i].size();k++)
                {
                    int tmp=words[i][k]-'a';
                    if(v[j][tmp]==1) { f=0; break;}
                }
                if(f) 
                {
                    int len=words[i].size()*words[j].size();
                    res=max(res,len);
                }
            }
        }
        return res;
    }
};

位运算:

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int n=words.size(), res=0;
        vector<int> v(n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<words[i].size();j++)
            {
                int tmp=words[i][j]-'a';
                v[i]|=(1<<tmp);
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if((v[i]&v[j])==0)//位运算要注意优先级,最好是打括号
                {
                    res=max(res,int(words[i].size()*words[j].size()));
                }
            }
        }
        return res;
    }
};

位运算优化:

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int n=words.size(), res=0;
        unordered_map<int,int> mp;
        for(int i=0;i<n;i++)
        {
            int num=0,len=words[i].size();
            for(int j=0;j<len;j++)
            {
                int tmp=words[i][j]-'a';
                num|=(1<<tmp);
            }
            if(mp.count(num)==0 || (mp.count(num) && mp[num]<len)) mp[num]=len;
        }
        for(auto it1:mp)
        {
            int num1=it1.first,len1=it1.second;
            for(auto it2:mp)
            {
                int num2=it2.first,len2=it2.second;
                if((num1&num2)==0)  res=max(res,len1*len2);
            }
        }
        return res;
    }
};

你可能感兴趣的:(Leetcode,leetcode,哈希算法,算法,c++)