题目:
Given an array of strings, return all groups of strings that are anagrams.(给定一组字符串,返回符合回文构词法的单词组,即如果某几个单词是回文单词,则放入一个容器中并返回)。
Note: All inputs will be in lower-case.(所有的输入都是小写)
Anagram(回文构词法)是指打乱字母顺序从而得到新的单词,比如 "dormitory" 打乱字母顺序会变成 "dirtyroom" , "tea" 会变成"eat"。
回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。
因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组 anagrams 。
思路:
可以使用unordered_map<string,vector<string> >把Anagram单词排序后的单词作为键,排序前的单词作为值,这些值放到一个容器中,即一个键对应多个值。如果这个值内单词的个数>1,说明存在Anagram单词,则加入到结果容器中。如果=1,说明不存在对应的Anagram词。
代码:
class Solution {
public:
vector<string> anagrams(vector<string> &strs)
{
vector<string> result;//保存结果
unordered_map<string,vector<string> > groups;//键值对
//先把键值对对应起来
for(int i = 0 ; i < strs.size() ; i++)
{
string word = strs[i];
sort(word.begin(),word.end());//对当前单词排序
groups[word].push_back(strs[i]);//插入键值对
}
//统计值中单词的个数是否>1,如果>1则把这个容器值插入到result的尾部
for(unordered_map<string,vector<string> >::iterator iter = groups.begin() ; iter != groups.end() ; iter++)
{
if(iter->second.size() > 1)
{
result.insert(result.end(),iter->second.begin(),iter->second.end());
}
}
return result;
}
};