LeetCode 49: Group Anagrams
阿新 • • 發佈:2018-11-24
本題主要是對字串分類,要求如下
首先可以利用雜湊的方式解決,給每一個字母一個特定的質數,那麼一個字母組合基本上對應唯一的雜湊值,根據雜湊值插入即可
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