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

Popular posts from this blog

Sudoku

Longest prefix matching - trie

Climbing Stairs