已知一组字符串,将所有anagram(由颠倒字母顺序而构成的字)放到一起输出。
例如:[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”]
返回:[[“ate”,“eat”,“tea”],[“nat”,“tan”],“bat”]
算法1:
#include<vector>
#include<map>
#include<string>
#include<algorithm>
class Solution
{
public:
Solution() {}
~Solution() {}
std::vector<std::vector<std::string>> groupAnagrams(std::vector<std::string>& strs)
{
std::vector<std::vector<std::string>> result;
std::string str;
std::map<std::string, std::vector<std::string>> anagram;
for (int i = 0; i < strs.size(); i++)
{
str = strs[i];
std::sort(str.begin(), str.end());
if (anagram.find(str)==anagram.end())
{
std::vector<std::string> item;
anagram[str] = item;
}
anagram[str].push_back(strs[i]);
}
std::map<std::string, std::vector<std::string>> ::iterator it;
for (it=anagram.begin(); it!=anagram.end(); it++)
{
result.push_back((*it).second);
}
return result;
}
};
运行结果为:
[bat]
[eat][tea][ate]
[tan][nat]
计算方法二:
#include<string>
#include<vector>
#include<map>
class Solution
{
public:
Solution() {}
~Solution() {}
std::vector<std::vector<std::string>> groupAnagrams(std::vector<std::string>& strs)
{
std::vector<std::vector<std::string>> result;
std::map<std::vector<int>, std::vector<std::string>> anagram;
for (int i = 0; i < strs.size(); i++)
{
std::vector<int> vec;
change_to_vec(strs[i],vec);
if (anagram.find(vec)==anagram.end())
{
std::vector<std::string> item;
anagram[vec] = item;
}
anagram[vec].push_back(strs[i]);
}
std::map<std::vector<int>, std::vector<std::string>> :: iterator it;
for (it=anagram.begin(); it!=anagram.end(); it++)
{
result.push_back((*it).second);
}
return result;
}
private:
void change_to_vec(std::string& str, std::vector<int>& vec)
{
for (int i = 0; i < 26; i++)
{
vec.push_back(0);
}
for (int i = 0; i < str.length(); i++)
{
vec[str[i] - 'a']++;
}
}
};
int main()
{
std::vector<std::string> strs;
strs.push_back("eat");
strs.push_back("tea");
strs.push_back("tan");
strs.push_back("ate");
strs.push_back("nat");
strs.push_back("bat");
Solution solve;
std::vector<std::vector<std::string>> result = solve.groupAnagrams(strs);
for (int i = 0; i < result.size(); i++)
{
for (int j = 0; j < result[i].size(); j++)
{
printf("[%s]", result[i][j].c_str());
}
printf("\n");
}
return 0;
}
运行结果为:
[tan][nat]
[eat][tea][ate]
[bat]