力扣-49-字母异位词分组
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
这个题用STL的容器来做会简单很多。
如何判断两个字符串是字母异位词,可以将这些字符串按照字典进行排序,这样排序后的字符串是一样的。
这样引入一个hash,索引是排序后的字符串,值是保存同一字母异位词的结果Vector,最后扫一遍hash输出即可。
#include <unordered_map> class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> hash; for (const auto& s:strs){ string tmp = s; sort(tmp.begin(), tmp.end()); hash[tmp].push_back(s); } int len = hash.size(), index = 0; vector<vector<string>> ans(len); for (const auto& i : hash){ ans[index++] = i.second; //将同一字母异位词的所有字符串放入ans } return ans; } };
这里用了C++11的新特性,简单说明一下。
unordered_map是一个关联容器,同map一样存储键-值,但是元素不会按照任何次序排列,如其名unordered。它也可以通过键key快速访问对应位置的value。
C++11也推出了auto来方便管理容器的迭代器。
- for(auto x:range):拷贝一份range中的元素,而不会改变range中元素;
- for(auto& x:range):引用,可以修改range中元素;
- for(const auto&x:range):当只想读取range中元素时,使用const auto&,它不会进行拷贝,也不会修改range;
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!