[leetcode] Group Anagrams

来源:互联网 发布:淘宝u站九块九包邮 编辑:程序博客网 时间:2024/06/09 17:03

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:

1.For the return value, each inner list's elements must follow the lexicographic order.

2.All inputs will be in lower-case.

题目大意是对给定的字符串数组中的单词分组,将属于同一anagrams(觉得翻译成变位词比较好)的分成一组。与这题相关的一道题是Valid Anagram建议先做下这题。

解题思路是使用hash的思想,将所有属于同一anagrams下的单词关联到同一 个hashkey中。现在的问题是如何求hashkey,一个容易想到但是是错误的思路是:将单词的各位相加得到的整数作为hashkey,比如(“ab”,“ba”)。这个思路错误的原因是有可能不属于同一anagrams下的单词也有相同的hashkey,比如(“ad”,“bc”)。所以,正确的方法是对单词排序,那么,属于同一anagrams下的单词的hashkey一定是一样的。AC代码如下

class Solution {public:    string hashKey(string t)    {        sort(t.begin(),t.end());        return t;    }    vector<vector<string>> groupAnagrams(vector<string>& strs) {                        map<string,vector<string>> maps;        for (int i = 0;i != strs.size();++i)        {            string key = hashKey(strs[i]);                        if (maps.find(key) == maps.end())            {                vector<string> tvec;                tvec.push_back(strs[i]);                maps[key] = tvec;            }            else            {                maps[key].push_back(strs[i]);            }        }                vector<vector<string>> ret;                for (auto it = maps.begin(); it != maps.end();++it)        {            vector<string> tmp = it->second;            sort(tmp.begin(),tmp.end());//题目要求对返回值内部排序。也可在函数开头直接对strs排序。            ret.push_back(tmp);        }                return ret;    }};



0 0
原创粉丝点击