题目:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
思路:
判断两个字符串是否为anagram的方法可以有: 1)将每个字符串的所有字符按字典序排列,比较是否相同。 2)用Hash表表示每个字符串的每个字符的出现次数。 3)用26个素数表示26个字符,字符串表示为所有字符数组对应的素数乘积。
本文选择了最后一种方法,因为他的空间复杂度较低。
代码:
class Data
{
public:
int value;
int index;
Data(int val, int ind)
{
value = val;
index = ind;
}
};
bool myFunc(Data i,Data j) { return (i.value<j.value);}
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
if(strs.size()<=1)
return *(new vector<string>());
int Prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
vector<Data> strNum;
for(int i=0;i<strs.size();i++)
{
int val=1;
for(int j=0;j<strs[i].size();j++)
{
val *= Prime[strs[i][j]-'a'];
}
Data d(val, i);
strNum.push_back(d);
}
vector<string> result;
sort(strNum.begin(),strNum.end(),myFunc);
bool same = false;
int pre=0;
for(int i=1;i<strNum.size();i++)
{
if(!same)
{
if(strNum[pre].value==strNum[i].value)
{
result.push_back(strs[strNum[pre].index]);
same = true;
}
}
if(same)
{
if(strNum[pre].value==strNum[i].value)
{
result.push_back(strs[strNum[i].index]);
}
else
{
same=false;
}
}
pre=i;
}
return result;
}
};