Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace::std;
class Solution {
public:
long RSHash(string str)
{
int a = 378551;
int b = 63689;
long hash = 0;
for(int i = 0; i < str.size(); i++)
{
hash = hash * a + str[i];
a = a * b;
}
return hash;
}
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<string> copy(strs);
vector<string> result;
map<long, vector<int> > mymap;
long key = 0;
for(size_t i = 0; i < strs.size(); i++)
{
sort(strs[i].begin(), strs[i].end());
}
for(size_t i = 0; i < strs.size(); i++)
{
//mymap[strs[i]].push_back(i);
mymap[RSHash(strs[i])].push_back(i);
}
for(size_t i = 0; i < strs.size(); i++)
{
if(mymap[RSHash(strs[i])].size() > 1)
while(mymap[RSHash(strs[i])].size() > 0)
{
result.push_back(copy[mymap[RSHash(strs[i])].back()]);
mymap[RSHash(strs[i])].pop_back();
}
}
return result;
}
};
int main()
{
vector<string> aa;
aa.push_back("tea");
aa.push_back("ate");
aa.push_back("eta");
Solution ss;
ss.anagrams(aa);
// int a;
// cout<<a<<endl;
// ss.print(ss.threeSum(aa));
}
知识点:
找出一个vector<string>中所有重复元素的位置, 先建立一个map<long,vector<int> >, 再将string通过hash 转换为 long
之后
for(int i = 0; i < size; i++)
map[hashvalue].push_back(i);
另外马哥说要复习各种时间复杂度的hash算法
Round 2:
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
map<string, int> map;
vector<string> result;
for(int i = 0; i < strs.size(); i++)
{
string temp = strs[i];
std::sort(temp.begin(), temp.end());
if(map[temp] == 0)
map[temp] = i+1;
else if(map[temp] == -1)
{
result.push_back(strs[i]);
}
else
{
result.push_back(strs[map[temp]-1]);
result.push_back(strs[i]);
map[temp] = -1;
}
}
return result;
}
};