首先要理解题目的意思,Anagrams指的是那些字母顺序不同但是个数完全相同的单词。如果两个字符串互为anagram,则它们的排序结果一定相同,因此可以把题目转化为寻找重复元素的问题。代码如下:
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
typedef unordered_map<string, int> Umap; //<span style="color:#ff0000;">学会typedef这种用法。</span>用hash map存储排序后的字符串,key为排序后字符串,value为该字符串对应的第一个原字符串在数组中的位置。如果value = -1,表示该字符串对应的第一个源字符串已经输出过。
Umap hashtable;
vector<string> res;
for(int i = 0; i < strs.size(); i++)
{
string s = strs[i];
sort(s.begin(), s.end()); // 对字符串进行排序
Umap::iterator ite = hashtable.find(s); // 查找s
if(ite == hashtable.end()) // 如果没有找到,则插入
hashtable.insert(Umap::value_type(s, i)); <span style="color:#ff0000;">// 学会value_type这种用法
</span> else
{ // 找到了
if(ite->second != -1)
{
res.push_back(strs[ite->second]);
ite->second = -1;
}
res.push_back(strs[i]);
}
}
return res;
}
};