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/


0 0