Tuesday, April 10, 2012

Program 10TH in C++

PROBLEM STATEMENT :

Write an efficient code to print pairs of anagrams from a given set of strings.

ex: anna, hjsds, nana, werwe, sads, eerww

Ouput:
anna nana
werwe eerww


SOLUTION :

#include <iostream.h>
#include <cstdio>
#include <vector.h>
#include <map.h>
#include <string.h>
#include <unistd.h>

using namespace std;

//bubble sort to sort strings

string sorting(string s)
{
char temp;

for(int i=0; i < s.length()-1; i++)
{
for(int j=i+1 ; j
{
if(s[i] > s[j])
{
temp = s[i];
s[i]=s[j];
s[j]=temp;
}
}

}
return s;
}


int main()
{
vector<string> v;
multimap<string,string> store;
multimap<string,string> :: iterator itm;
multimap<string,string> :: iterator itm1;
string s;
string sorted;
int i=0;
int flag=0;

//pushing strings input by user in vector

while(true)
{
getline(cin,s,'\n');
if(cin.good())
v.push_back(s);
else
break;
}

//storing sorted string as key and value as original string in multimap

for(i=0; i<v.size(); i++)
{
sorted=sorting(v[i]);
store.insert(pair<string,string>(sorted,v[i]));
}

pair<multimap<string,string>::iterator,multimap<string,string>::iterator> ret;

//traversing the map to print the pairs of anagrams if present

for(itm1=store.begin(); itm1!=store.end(); itm1++)
{

ret=store.equal_range(itm1->first);

if((int)store.count(itm1->first) != 1)
{
if(flag == 0)
{
cout<<"\n\nAnagrams are as follows :\n\n";
flag=1;
}
for(itm=ret.first; itm!=ret.second; itm++)
{
cout<<itm->second<<" ";
store.erase(itm);
}

cout<<endl<<endl;
}

}

if(flag == 0)
{
cout<<"\n\nNo Anagrams are present\n\n";
}
}

No comments:

Post a Comment