https://oj.leetcode.com/problems/anagrams/
anagrams:如果两个字符串具有完全相同的字符,只是字符的排序不同,则称为anagrams——回文构词法,因此anagrams至少指两个字符串。
1、题目要求:给定一组字符串,返回所有回文构词法组成的单词。
注:所有字符都是小写的。
例:假设输入[ "tea", "ate", "eat", "are", "wander", "warned", "and" ]
则返回["tea", "ate", "eat", "wander", "warned" ] —— 有两组回文;
2、解题思路:
1)依次访问数组中的每个单词,将单词排序后作为键值key保存在hash table里,然后将单词排序,在hash table里面查找,如果找到了,则说明此单词是回文;如果没有找到,则将其排序后的字符作为键值key保存在hash table里,以便后面的单词匹配关键字key(说明有多组回文);
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
vector<string> result;
string key;
map<string, int> string_map;
map<string, int>::iterator it;
for(int i=0; i!=strs.size(); i++)
{
key= strs[i];
sort(key.begin(), key.end()); //将每个单词排序后,再将其作为键值key
it= string_map.find(key);
if(it!=string_map.end()) //如果找到了,则将其添加到result后面;
{
if(string_map[key]>=0)
{
result.push_back(strs[string_map[key]]); //将第一个重复的单词添加到result后面;
string_map[key]= -1;
}
result.push_back(strs[i]); //依次添加重复键key对应的单词strs[i];
}
else
{
string_map[key]= i; //如果没有找到,则将其加入hash table中
}
}
return result;
}
};
2)首先依次访问strs里面的所有单词,将相同key对应的单词添加到hash tale里,然后判断关键码key后面的元素个数是否大于1,
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
vector<string> result;
map<string, vector<string> > m;
int n= strs.size();
string key;
for (int i= 0; i< n; i++)
{
key= strs[i];
sort(key.begin(), key.end());
//如果key在m中不存在,则将创建一个以key为关键码的记录,并将strs[i]加到此记录后面
//如果key在m中已存在,则将strs[i]加到以key为关键码的记录后面
m[key].push_back(strs[i]);
}
for (map<string, vector<string> >::iterator iter= m.begin(); iter!= m.end(); iter++)
{
//如果某个关键码后面的元素个数>1,则说明此关键码有对应的回文,将此关键码后面的元素都添加到result里
if ((iter->second).size() > 1)
{
for (int i= 0; i< (iter->second).size(); i++)
result.push_back((iter->second)[i]);
}
}
return result;
}
};