【LeetCode】49. Group Anagrams
2016-03-18 11:16
246 查看
题目:
Given an array of strings, group anagrams together.For example, given:
["eat", "tea", "tan", "ate", "nat", "bat"], Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.
提示:
这道题要把所有字母组成相同的单词归为一类。因此我们可以把每个字母都进行排序,然后利用一个hash_map保存。即以排序后的结果作为键,map的值可以是一个set,把排序前的结果插入到set当中。由于set的底层实现利用了平衡二叉搜索树,所以插入以后的元素是已经排好序的。这样归类就完成了。代码:
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; if (strs.empty()) { return res; } unordered_map<string, multiset<string>> um; for (string str : strs) { string tmp = str; sort(tmp.begin(), tmp.end()); um[tmp].insert(str); } for (auto m : um) { vector<string> sol(m.second.begin(), m.second.end()); res.push_back(sol); } return res; } };
实际上,由于对单词排序时,题目已经限定了单词只可能是26个小写字母组成的,所以我们可以使用计数排序进一步加快算法的速度(排序部分速度从O(nlogn)变为O(n)),代码如下:
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; if (strs.empty()) { return res; } unordered_map<string, multiset<string>> um; for (string str : strs) { string tmp = strSort(str); um[tmp].insert(str); } for (auto m : um) { vector<string> sol(m.second.begin(), m.second.end()); res.push_back(sol); } return res; } string strSort(string s) { vector<int> count(26, 0); for (int i = 0; i < s.length(); ++i) { ++count[s[i] - 'a']; } string res = ""; for (int i = 0; i < 26; ++i) { while (count[i]--) { res += ('a' + i); } } return res; } };
相关文章推荐
- 第六天、打渔晒网问题
- PHP 删除二维数组中的重复值函数
- iOS UIAlertView的基本使用
- boost
- ping判断内网地址是否存活脚本
- class-dump 使用(转)
- ios 数据持久化的四种方式
- assets目录下资源使用方法
- PHP Base64 中英文编码 JavaScript 解码
- Material Design学习之 Bottom navigation
- 堆和栈的区别是什么?
- Swagger与SpringMVC项目整合
- Count按条件查询
- ecshop二次开发50个小技巧
- 深入浅出Python(中文版) 下载地址
- IE6版本中点击验证码旁边的“看不清”后验证码图片消失未加载出
- Material Design学习之 Bottom navigation
- poj 1517 u Calculate e
- 做人底线7句话
- 详解Linux系统中的日期设定与date命令的用法