Given two (dictionary) words as Strings, determine if they are isomorphic
. Two words are called isomorphic if the letters in one word can be remapped
to get the second word. Remapping a letter means replacing all occurrences
of it with another letter while the ordering of the letters remains
unchanged. No two letters may map to the same letter, but a letter may map
to itself.
Example:
Given "foo", "app"; returns true
we can map 'f' -> 'a' and 'o' -> 'p'
Given "bar", "foo"; returns false
we can't map both 'a' and 'r' to 'o'
Given "turtle", "tletur"; returns true
we can map 't' -> 't', 'u' -> 'l', 'r' -> 'e', 'l' -> 'u', 'e' -'r'
Given "ab", "ca"; returns true
. Two words are called isomorphic if the letters in one word can be remapped
to get the second word. Remapping a letter means replacing all occurrences
of it with another letter while the ordering of the letters remains
unchanged. No two letters may map to the same letter, but a letter may map
to itself.
Example:
Given "foo", "app"; returns true
we can map 'f' -> 'a' and 'o' -> 'p'
Given "bar", "foo"; returns false
we can't map both 'a' and 'r' to 'o'
Given "turtle", "tletur"; returns true
we can map 't' -> 't', 'u' -> 'l', 'r' -> 'e', 'l' -> 'u', 'e' -'r'
Given "ab", "ca"; returns true
we can map 'a' -> 'c', 'b' ->'a'
bool isomorphic(const string& s1, const string& s2)
{
if(s1.length() != s2.length())
return false;
unordered_map<char,char> ht;
unordered_map<char,char> reverseHT;
for(size_t i = 0;i<s1.length();++i)
{
auto it = ht.find(s1[i]);
if(it == ht.end())
{
auto itt = reverseHT.find(s2[i]);
if(itt == reverseHT.end())
{
ht.insert(make_pair(s1[i],s2[i]));
reverseHT.insert(make_pair(s2[i],s1[i]));
}
else if(itt->second != s1[i])
return false;
}
else if(it->second != s2[i])
return false;
}
return true;
}