力扣-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;
posted @ 2020-07-14 14:57  Peterxiazhen  阅读(124)  评论(0编辑  收藏  举报