题目:
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
class Node{
public:
vector<char> bit;
int len;
int index;
int operator < (const Node& right) const {
if(this->len != right.len){
return this->len < right.len;
} else {
for(int i = 0; i < 26; i++){
if(bit[i] != right.bit[i]){
return bit[i] < right.bit[i];
}
}
return false;
}
}
int operator == (const Node& right) const {
if(this->len != right.len){
return false;
} else {
if(this->len == 0){
return true;
}
for(int i = 0; i < 26; i++){
if(bit[i] != right.bit[i]){
return false;
}
}
return true;
}
}
};
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len = strs.size();
vector<string> ans;
if(len < 2){
return ans;
}
vector<Node> vec;
int i, j;
for(i = 0; i < len; i++){
Node node;
vector<char> a(32, 0);
node.len = strs[i].size();
if(node.len != 0){
for(j = 0; j < node.len; j++){
a[strs[i][j] - 'a']++;
}
}
node.bit = a;
node.index = i;
vec.push_back(node);
}
sort(vec.begin(), vec.end(), less<Node>());
for(int i = 0; i< len - 1; i++){
if(vec[i] == vec[i+1]){
ans.push_back(strs[vec[i].index]);
ans.push_back(strs[vec[i + 1].index]);
int j = 2;
while(i + j < len && vec[i] == vec[i+j]){
ans.push_back(strs[vec[i + j].index]);
j++;
}
i = i+j - 1;
}
}
return ans;
}
};