# 205_Isomorphic_Strings ###### tags: `leetcode` ## Problem Statement Given two strings s and t, determine if they are isomorphic. Two strings s and t are isomorphic if the characters in s can be replaced to get t. All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character, but a character may map to itself. - Example 1: > Input: s = "egg", t = "add" > Output: true - Example 2: > Input: s = "foo", t = "bar" > Output: false - Example 3: > Input: s = "paper", t = "title" > Output: true - Constraints: > 1 <= s.length <= 5 * 10^4^ > t.length == s.length > s and t consist of any valid ascii character. ## Solution - To do this task, ```map``` is used in this case. ```cpp= map<char, char> dict; map<char, char>::iterator iter; ``` - To map the whole relation, there are 2 main constraints need to consider. - 1 to 1 relation - order is the same - the order issue is simply resolved by the loop because it compare the pair one by one. - To construct the 1 to 1 relation, the structure of the map is like below. |Attribute|String| |-|-| |key|s[i]| |value|t[i]| ```cpp= dict[s[0]] = t[0]; //inside for-loop iter= dict.find(s[i]); // if the key is found but not the same value if (iter!= dict.end()&& iter->second!= t[i]) { return false; } // if the key is not found if (iter== dict.end()) { dict[s[i]]= t[i]; } ``` - This relation is ```n to 1```, to make it ```1 to 1```, when the iter is not found, we also need to check whether the value is written. - The searching zone is from the beginning to the former of the value string, it return ```npos``` if not found. ```cpp= if (t.rfind(t[i], i- 1)!= string::npos) return false; ```