Given an array of strings, return all groups of strings that are anagrams.(返回有为回文构词法的组)
Note: All inputs will be in lower-case.
Anagrams(回文构词法)是指由颠倒字母顺序组成的单词。首先回文,则排序,则可以检查。但是不能改变原来的数据(用临时变量)。
后面查找很容易想到hash,由于c++对hash支持不太好,此处用map。(或者另一思路,字典在排序。较为麻烦)。
vector<string> anagrams(vector<string> &strs)
{
if (strs.empty())vector<string>();
map<string ,int> str_map;
map<string ,int>::iterator it;
vector<string> res;
for (int i = 0;i < strs.size();i++)//加入到map后续看是否,该数据存在,不存在则加入map,存在则加入结果(并把map中的也加入)
{
string str_temp = strs[i];//不破坏原数据
sort(str_temp.begin(),str_temp.end());
if ((it = str_map.find(str_temp)) == str_map.end())//未找到
{
str_map.insert(pair<string,int>(str_temp,i));
}
else
{
if(it->second >= 0)//的考虑开始加进去的
{
res.push_back(strs[it->second]);
it->second = -1;//清除掉(已加入)
}
res.push_back(strs[i]);//后续的!
}
}
return res;
}
测试用例:
"tea","and","ate","eat","den“ (输入)
"tea","ate","eat","and","den” (输出)