问题描述:
Given an array of strings, return all groups of strings that are
anagrams. Note: All inputs will be in lower-case.
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。
例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
本题中输入的字符串都是小写的,而且此题返回值要求是vector所以只能有一组anagrams。
解题思路:
先将所有的单词按英文字母顺序排序,设置一个map,排列后的单词作为map的key,值是vector类型,存放的刚好是互为anagrams的若干单词。
class Solution
{
public:
vector<string> anagrams(vector<string> &strs)
{
vector<string> result;
map<string, vector<string> > countMap;
if(strs.empty())
return result;
if(strs.size() == 1)
return result;
vector<string> strs_duplication;
strs_duplication = strs;
for(size_t i=0; i<strs_duplication.size(); i++)
{
string tempString = strs_duplication[i];
//此处是大小写转换,针对本题可忽略
for(unsigned int j=0; j<tempString.length(); j++)
{
if(tempString[j]>=65&&tempString[j]<=90)
tempString[j]=(char)(tempString[j]+32);
}
//使用sort函数排序
char* s;
const int len = tempString.length();
s =new char[len+1];
strcpy(s,tempString.c_str());
sort(s,s+tempString.length());
countMap[s].push_back(tempString);
}
for(map<string, vector<string> >::iterator iter = countMap.begin(); iter != countMap.end(); iter++)
{
if ((iter->second).size() > 1)
{
for(unsigned int i = 0; i < (iter->second).size(); i++)
result.push_back((iter->second)[i]);
}
}
return result;
}
};