Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
分析:所谓Anagrams指的是回文构词法。就是两个字符串所有的字符相同但是位置不同。比如”eat"和“tea"。
最开始我想通过一种构词方法,就是每个字母对应一个素数,这样可以计算每个字符串的特征值。
这是由于这样的数学性质:任何一个整数可以并且唯一表示成若干个素数的乘积。然后通过Map对应把string对应一个数。对大的string可能还有溢出的情况。
但是对于这一道题目不用如此麻烦。我们维护一个map表,把string的每个字母做排序后放进去,对应它的位置。然后如果在Map中找到该字符串,就说明发现了回文构词,把这两个词放入结果数组中。特别注意的是最早放进去的字符串的处理。
代码如下:
class Solution {
public:
vector<string> anagrams(vector<string>& strs) {
vector<string> ret;
map<string,int> Map;
for(int i = 0;i<strs.size();++i){
string s = strs[i];
sort(s.begin(),s.end());
if(Map.find(s)==Map.end()){
Map[s]=i;
}
else{
if(Map[s]>=0){ //如果是第一次查找到
ret.push_back(strs[Map[s]]);
Map[s]=-1; //避免重复放入
}
ret.push_back(strs[i]);
}
}
return ret;
}
};