题目描述
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
anagrams的例子:
“eat”、“ate”、“tae”;
“abc”、“cab”、“bac”;
特例:“”、“”。
思路:用关联容器map,即key-value。
这里给出了两种方法:
第一种是:key为string,存储排序后的单词;value为int,存储每个排序后单词的个数。
第二种是:key为string,存储排序后的单词;value为vector<string>,直接存储当前单词。
代码:
vector<string> anagrams2(vector<string> &strs);
vector<string> anagrams(vector<string> &strs);
int main(){
vector<string> strs;
strs.push_back("eat");
strs.push_back("");
strs.push_back("");
strs.push_back("ate");
strs.push_back("tae");
strs.push_back("bat");
strs.push_back("grt");
vector<string> result = anagrams(strs);
int i;
for(i=0; i<result.size(); ++i)
{
cout << result[i] << endl;
}
return 0;
}
vector<string> anagrams(vector<string> &strs){
vector<string> result;
if(strs.size() == 0)
return result;
map<string, int> siMap;
map<string, int>::iterator siMapIter;
unsigned int i;
for(i=0; i<strs.size(); ++i){
string s = strs[i];
sort(s.begin(), s.end());
siMapIter = siMap.find(s);
if(siMapIter == siMap.end()){//原来的map中没有关键字s
siMap.insert(pair<string, int>(s, 1));
}
else
siMapIter->second += 1;
}
string ana;
for(siMapIter = siMap.begin(); siMapIter != siMap.end(); ++siMapIter){
if(siMapIter->second > 1){
ana = siMapIter->first;
for(i=0; i<strs.size(); ++i){
string s = strs[i];
sort(s.begin(), s.end());
if(s.compare(ana) == 0)
result.push_back(strs[i]);
}
}
}
return result;
}
vector<string> anagrams2(vector<string> &strs){
//vector<string> result;
map<string, vector<string> > siMap;
map<string, vector<string> >::iterator siMapIter;
unsigned int i;
for(i=0; i<strs.size(); ++i){
string s = strs[i];
sort(s.begin(), s.end());
siMapIter = siMap.find(s);
if(siMapIter == siMap.end()){//原来的map中没有关键字s
vector<string> temp;
temp.push_back(strs[i]);
siMap.insert(pair<string, vector<string> >(s, temp));
}
else
(siMapIter->second).push_back(strs[i]);
}
vector<string> result;
vector<string>::iterator resIter= result.end();
for(siMapIter = siMap.begin(); siMapIter != siMap.end(); ++siMapIter){//把个数大于1的词放入result
if((siMapIter->second).size() > 1){
result.insert(resIter, siMapIter->second.begin(), siMapIter->second.end());
resIter = result.end();
}
}
return result;
}