class Solution {
//anagrams represent two string consists the same characters
//should pay attention to the meaning of anagrams
public:
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map<string, vector<string>> dict;
for (int i = 0; i < strs.size(); ++i)
{
string word = strs[i];
sort(word.begin(), word.end());
dict[word].push_back(strs[i]);
}
//check if they are anagrams
map<string, vector<string>>::iterator it;
vector<string> ans;
for (it = dict.begin(); it != dict.end(); it++)
{
if (it->second.size() > 1) //then they forms an anagrams
{
for(int i = 0; i < it->second.size(); ++i)
ans.push_back(it->second[i]);
}
}
return ans;
}
};
second time
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map<string, int> baseWord;
for(int i = 0; i < strs.size(); ++i)
{
string tmpStr = strs[i];
sort(tmpStr.begin(), tmpStr.end());
if(baseWord.find(tmpStr) == baseWord.end()) baseWord[tmpStr] = 1;
else baseWord[tmpStr]++;
}
vector<string> ans;
for(int i = 0; i < strs.size(); ++i)
{
string tmpStr = strs[i];
sort(tmpStr.begin(), tmpStr.end());//this can be optimized
if(baseWord.find(tmpStr) != baseWord.end() && baseWord[tmpStr] > 1) ans.push_back(strs[i]);
}
return ans;
}
};