1. 程式人生 > >LeetCode 49: Group Anagrams

LeetCode 49: Group Anagrams

  本題主要是對字串分類,要求如下

首先可以利用雜湊的方式解決,給每一個字母一個特定的質數,那麼一個字母組合基本上對應唯一的雜湊值,根據雜湊值插入即可

class Solution {
public:
    
    int strFind(map<char,int>&m,string s,vector<int>&hash)
    {
        long tmp=1;
        for(int i=0;i<s.size();i++)
        {
            tmp*=m[s[i]];
            if(tmp>INT_MAX) tmp=tmp%INT_MAX;
        }
        for(int i=0;i<hash.size();i++)
        {
            if(hash[i]==tmp) return i;
        }
        hash.push_back(tmp);
        return -1;
    }
    
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        map<char,int> m;
        m['a']=2;
        m['b']=3;
        m['c']=5;
        m['d']=7;
        m['e']=11;
        m['f']=13;
        m['g']=17;
        m['h']=19;
        m['i']=23;
        m['j']=29;
        m['k']=31;
        m['l']=37;
        m['m']=41;
        m['n']=43;
        m['o']=47;
        m['p']=53;
        m['q']=59;
        m['r']=61;
        m['s']=67;
        m['t']=71;
        m['u']=73;
        m['v']=79;
        m['w']=83;
        m['x']=97;
        m['y']=101;
        m['z']=103;
        
        vector<vector<string>>ans;
        vector<int>hash;
        int pos;
        for(int i=0;i<strs.size();i++)
        {
            pos=strFind(m,strs[i],hash);
            if(pos!=-1)
            {
                ans[pos].push_back(strs[i]);
            }
            else{
                vector<string> line;
                line.push_back(strs[i]);
                ans.push_back(line);
            }
        }
        return ans;
    }
};

 

但是這種方法在對INT_MAX取餘之後會有一定概率出現衝突,而且這種方法只能解決這種26個英文字母的方式,總感覺很蠢,而且執行時間88ms,只能打敗10.8%使用者。

 

仔細思考後發現,每個分類集合裡面的字串只是順序不同而已,排個序利用map對映不就行了,於是採用如下方法:

class Solution {
public:

    
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>>ans;
        unordered_map<string,vector<string>>mp;
        
        
        for(auto s:strs)
        {
            string t=s;
            sort(t.begin(),t.end());
            mp[t].push_back(s);
        }
        
        for(auto line:mp)
        {
            ans.push_back(line.second);
        }
       
        return ans;
    }
};

這樣更加普適,並且不會存在衝突,時間效率只要24ms