Anagrams
来源:互联网 发布:linux help分段显示 编辑:程序博客网 时间:2024/04/30 13:02
国际惯例先附上我的代码:
class Solution {public: vector<string> anagrams(vector<string> &strs) { vector<string> ret; vector<string> tmpstrs=strs; unordered_multimap<string, int> hash; unordered_multimap<string, int>::iterator it; if(strs.empty()) return ret; for(int i=0;i<tmpstrs.size();i++){ sort(tmpstrs[i].begin(),tmpstrs[i].end()); hash.insert({tmpstrs[i],i}); } for(int i=0;i<tmpstrs.size();i++){ if(hash.count(tmpstrs[i])>1){ auto range=hash.equal_range(tmpstrs[i]); for(it=range.first;it!=range.second;it++) ret.push_back(strs[it->second]); hash.erase(tmpstrs[i]); } else hash.erase(tmpstrs[i]); } return ret; }};
这个题算是比较简单吧,一开始就想到思路了,就是先把每个string按字母顺序排序一下,然后再循环比较。一开始技术路线是想弄一个长度为26的int数组记录每个单词的字母出现频率(Anagrams的特点就是每两个词之间有着同样个数的相同的字母),然后比较排序什么的函数也自己写。后来发现这样写起来太复杂了,然后上网搜搜看有没有好点的算法,搜了一轮发现算法基本都是一样,主要大部分人都是用STL实现的,主要参考了一个哥们的代码[1]后发现STL真的灰常强大,这个题目对我的意义变成了对STL的一些东西有了更深投入的理解:
(1)sort():这个函数可以对一个数组或者vector(元素是数字或者字母)进行排序,而且还可以自己定义比较的规则。
(2)无序容器unordered_multimap:这个容器实际上就是一个哈希表,根据关键字来确定值(和map不同的地方是允许相同关键字对应不同的值)。STL也提供了很多方便操作的接口,值得一提的是equal_range(key)这个成员函数,这个函数返回一个pair<first,second>[2]的值,相当于返回了和key相等的所有元素然后排成一列(逻辑上),first和second分别指这个列的首末位置,可以用一个iterator去操作,非常方便。[1]对于这个返回值直接用了auto自动变量代替类型,这是C++11的新特性,也是非常好用,对于一些类的模板里面参数很多不能确定的话就直接用auto吧(举个例子,这个equal_range(key)的返回值真正的类型是,
pair<multimap<string, string>::iterator, multimap<string, string>::iterator>
。。。。。。
还是用auto让编译器自己确定变量的类型吧:)。
参考:
[1] http://blog.csdn.net/zxzxy1988/article/details/8586106
[2] http://www.cplusplus.com/reference/unordered_map/unordered_multimap/equal_range/
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- Anagrams
- anagrams
- Anagrams
- Anagrams
- Anagrams
- (六)模板方法模式
- 进程资源限制(rlimit)
- 最短路kruskal算法
- 感知机算法的matlab实现
- 第三周作业
- Anagrams
- FragmentTransaction 实用方法
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合十:TreePanel 之 管理菜单
- python中的迭代器与生成器详解
- 常用PHP操作MySQL命令
- about php.ini
- nyoj_273字母小游戏
- java正则表达式
- java基础_14_正则表达式