LeetCode 049 Group Anagrams
来源:互联网 发布:工业分析数据的重要性 编辑:程序博客网 时间:2024/04/29 12:06
题目:给出一组字符串,要求把由变化字母顺序而构成的单词(Anagram)归类。同一组中的单词要按字典序排列。
解法一:
把26个字母的出现次数存在vector中,作为key。把单词字符串组成的set作为value,存在一个map中。
代码:
vector<vector<string>> groupAnagrams(vector<string>& strs) { map<vector<int>, multiset<string>> f; for(int i = 0 ; i < strs.size() ; i++) { vector<int> feature(26, 0); for(int j = 0 ; j < strs[i].length() ; j++) { feature[strs[i][j] - 'a']++; } f[feature].insert(strs[i]); } vector<vector<string>> results; for(auto i = f.begin() ; i != f.end() ; ++i) { vector<string> tmp; for(auto j = i->second.begin() ; j != i->second.end() ; ++j) { tmp.push_back(*j); } results.push_back(tmp); } return results; }
提交以后运行时间为128 ms。
解法二:
上一种解法的vector,string参数传递比较占用时间。所以key使用排序后的string,value使用单词的index组成的vector,再使用hashmap存放。
代码:
vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<int>> f; for(int i = 0 ; i < strs.size() ; i++) { string s = strs[i]; sort(s.begin(), s.end()); f[s].push_back(i); } vector<vector<string>> results; for(auto i = f.begin() ; i != f.end() ; ++i) { vector<string> tmp; for(auto j = i->second.begin() ; j != i->second.end() ; ++j) { tmp.push_back(strs[*j]); } sort(tmp.begin(), tmp.end()); results.push_back(tmp); } return results; }
提交后运行时间为72ms。
解法三:
自己实现hash函数。设p_i为第i个质数,则前26个质数对应26个小写字母,将每个字母的出现次数作为对应质数的幂次,求乘积。这样Anagram求出来的hash值肯定是相同的(数论中质因数分解的唯一性)。
代码:
vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<int, vector<int>> f; int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103}; for(int i = 0 ; i < strs.size() ; i++) { string s = strs[i]; int tmp = 1; for(int j = 0 ; j < strs[i].length() ; j++) tmp *= p[strs[i][j] - 'a']; f[tmp].push_back(i); } vector<vector<string>> results; for(auto i = f.begin() ; i != f.end() ; ++i) { vector<string> tmp; for(auto j = i->second.begin() ; j != i->second.end() ; ++j) { tmp.push_back(strs[*j]); } sort(tmp.begin(), tmp.end()); results.push_back(tmp); } return results; }
提交后运行时间仍然为72ms,估计这种方法如果自己实现hash容器会更快。
0 0
- LeetCode 049 Group Anagrams
- [LeetCode]049-Group Anagrams
- LeetCode 049 Group Anagrams
- leetcode之路049 Group Anagrams
- LeetCode Group Anagrams
- Leetcode#49||Group Anagrams
- [LeetCode] Group Anagrams
- [leetcode] 49.Group Anagrams
- LeetCode题解:Group Anagrams
- [leetcode] Group Anagrams
- LeetCode-Group Anagrams
- LeetCode OJ:Group Anagrams
- [Leetcode]Group Anagrams
- 《leetCode》:Group Anagrams
- leetcode | Group Anagrams
- leetcode 49:Group Anagrams
- LeetCode -- Group Anagrams
- LeetCode---Group Anagrams
- 通过Java源码分析初探观察者模式(一)
- 网友倾诉
- JSP使用过滤器防止SQL注入
- 这个是我今天自己写的对缓冲区的个人理解
- 【转载】施一公谈如何做科研
- LeetCode 049 Group Anagrams
- Linux命令学习总结(一)
- sap 几类凭证
- 飛飛(四十九)用友元函数来编写运算符重载
- 百度地图申请Key jar包和.so文件导入AS中
- C#学习笔记之多态之接口
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- HDU 1240 Asteroids!(BFS)
- 全排列递归实现