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