Anagrams Sort String
/***
Write a method to sort an array of strings so that all the anagrams are next to each other.
***/
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
/* anagrams consist from same letters in different order.
so just check the # of each letter and the length of string. */
// idea: using hashtabel with chaining...
// how to implement hashtable????
class Anagrams
{
public:
Anagrams(string *str, int sz);
~Anagrams();
void sortbyAnagrams();
void print_out_strings();
private:
void add_new_map_entry(string, int);
//<int, string> -- (position of string, sorted string)
map<string, vector<int>> mymap;
string *mystr;
int size;
};
Anagrams::Anagrams(string *str, int sz)
{
mymap.clear();
mystr = str;
size = sz;
}
Anagrams::~Anagrams()
{
mymap.clear();
}
void Anagrams:: sortbyAnagrams() {
map<string, vector<int>> :: iterator it;
string *ptr, tempstr;
int pos;
// initial
ptr = mystr;
pos = 0;
while(pos != size) {
tempstr = *ptr;
sort(tempstr.begin(), tempstr.end());
it = mymap.find(tempstr);
if(it != mymap.end()) it->second.push_back(pos);
else add_new_map_entry(tempstr, pos);
pos++;
ptr++;
}
}
void Anagrams::print_out_strings() {
map<string, vector<int>> :: iterator it;
string s;
for(it = mymap.begin(); it != mymap.end(); it++) {
int sz = it->second.size();
for(int i = 0; i<sz; i++) {
s = mystr[it->second.back()];
it->second.pop_back();
cout << s <<" ";
}
}
}
void Anagrams::add_new_map_entry(string key, int pos) {
vector<int> v;
v.push_back(pos);
mymap.insert(pair<string, vector<int>>(key,v));
}
void main() {
string str[] = {"abc", "ctt", "acb", "kaa", "cba", "ttc"};
int s = sizeof(str) / sizeof(string);
Anagrams ana(str, s);
ana.sortbyAnagrams();
ana.print_out_strings();
}
Comments
Post a Comment