#include <vector>
#include <unordered_map>
#include <string>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
vector<string> sort_string_anagram(vector<string> array)
{
unordered_map<string, set<string>> anagram;
for(string word : array)
{
string sorted_word(word);
sort(sorted_word.begin(),sorted_word.end());
anagram[sorted_word].insert(word);
}
sort(array.begin(), array.end());
vector<string> result;
for(string word : array)
{
unordered_map<string,set<string>>::iterator iter;
string sorted_word(word);
sort(sorted_word.begin(), sorted_word.end());
if( (iter = anagram.find(sorted_word)) != anagram.end() )
{
for(set<string>::iterator it = (iter->second).begin(); it!= (iter->second).end();++it)
{
result.push_back(*it);
}
anagram.erase(iter);
}
}
return result;
}
@Jitendard、@taocp、時間の複雑さを持つ完全なソリューション: O( N(MlogM) + NlogN + N(MlogM + A) )。N は配列サイズ、M は単語サイズ、A は単語に対して存在するアナグラムの最大数です。