Problem Statement:
Given a string of words return all words which have their reverse present in the string as ( (word1 , reverseword1 ) , (word2 ,reverseword2) )
Example Case:
Input:
Sachin tendulkar is the best tseb eht nihcaS
Output:
{ ( best , tseb ) , ( the , eht) , (Sachin , nihcaS) }
My approach is to use a map and return the words if a match to the reverse of the current word is found in the map.
#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
int main()
{
unordered_map <string, int> binMap;
string test="Sachin tendulkar is the best tseb eht nihcaS si";
int i=0,j=0;
string temp,rev;
string::iterator it;
cout<<"{";
for(i = 0, it = test.begin() ; it <= test.end(); ++it)
{
if(*it==' ' || it==test.end())
{
temp=test.substr(j,i-j);
rev=string(temp.rbegin(), temp.rend());
if(binMap[rev]==1)
cout<<"( "<<rev<<","<<temp<<" ), ";
else
binMap[temp]=1;
j=i+1;
}
i++;
}
cout<<"}";
return 0;
}
Is this the most optimal way to solve the problem or am I doing something wrong?
"This si"should produce{(si,is)}as"is"is present in the string"This si". \$\endgroup\$