题名:Group Anagrams
难度:Medium
题目描述:
题目分析:
anagram:由颠倒字母顺序而构成的字,题意很容易懂,就是找出所有组成字母一样的字符串。但乍一看好像很麻烦的样子,如果把每一个string都与其它string对比再分类的话,时间复杂度很高。这些字符串有什么共同点呢?前面说了,它们的组成字母相同,如果可以将这些组成字母作为一个个的tag,来给这些字符串分组的话,问题就很容易解决了。这时候就要想到图——map这个容器了,简直是为这个题目量身定做的!我们可以把string排序(利用sort函数)作为图的key,之后对号入座就行了。
代码如下:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
typedef map<string, vector<string>> MAP;
typedef vector<string> VS;
MAP anagrams;
for(int i = 0; i < strs.size(); i++){
string s = strs[i];
sort(s.begin(), s.end()); //给string排序,得到key值
MAP::iterator it = anagrams.find(s);
if(it == anagrams.end()){ //新元素
VS v;
anagrams.insert(MAP::value_type(s, v)); //s作为新的key,加入map中
}
it = anagrams.find(s); //将strs[i]作为value添加至对应的组中
it->second.push_back(strs[i]);
}
vector<VS> ana;
MAP::iterator iter;
for(iter = anagrams.begin(); iter != anagrams.end(); ++iter){
ana.push_back(iter->second);
}
return ana;
}
};
新得体会:
用java会代码更简单。