---
# System prepended metadata

title: '[LeetCode 205. Isomorphic Strings](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/609/week-2-july-8th-july-14th/3811/)'

---

# [LeetCode 205. Isomorphic Strings](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/609/week-2-july-8th-july-14th/3811/)
### Daily challenge Jul 12, 2021 (EASY)

>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.

:::info
**Example 1:**
**Input:** s = "egg", t = "add"
**Output:** true
:::

:::info
**Example 2:**
**Input:** s = "foo", t = "bar"
**Output:** false
:::

:::info
**Example 3:**
**Input:** s = "paper", t = "title"
**Output:** true
:::

:::warning
**Constraints:**

* 1 <= s.length <= 5 * 104
* t.length == s.length
* s and t consist of any valid ascii character.
:::

---



### Approach 1 : Map :bulb:
**`16 ms`**
使用兩個 **unordered_map** 分別紀錄兩個字串的 **`當前元素`** 在此之前 **`最後出現的 index`**。
假設兩者 index 不同， 則表示兩個字串 **not** Isomorphic Strings。

> s = "egg" , t = "add"
> i = 0 ---> map1[e] = map2[a] = 0
> i = 1 ---> map1[g] = map2[d] = 1
> i = 2 ---> g = 1, d = 1 :ok_hand: ---> map1[g] = map2[d] = 2
> **true**

> s = "foo" , t = "bar"
> i = 0 ---> map1[f] = map2[b] = 0
> i = 1 ---> map1[o] = map2[a] = 1
> i = 2 ---> o = 1, r ++*not found*++ ---> **false**

```cpp=1
class Solution {
public:
    bool isIsomorphic(string s, string t) {  
        if(s.length() != t.length())    return false;
        
        unordered_map<char, int> index_s;
        unordered_map<char, int> index_t;
        
        for(int i=0; i<s.length(); i++){
            if(index_s.find(s[i]) != index_s.end() || index_t.find(t[i]) != index_t.end()){
                if(index_s.find(s[i]) == index_s.end()
                    || index_t.find(t[i]) == index_t.end()
                    || index_s[s[i]] != index_t[t[i]] )  return false;
            }
            index_s[s[i]] = i;
            index_t[t[i]] = i;
        }
        
        return true;
    }
};
```

### Approach 2 : Without Maps :book:
**`4 ms`**
與 Approach 1 想法相同。
但改為使用 array[256] 紀錄每個元素出現的位置。

```cpp=1
class Solution {
public:
    bool isIsomorphic(string s, string t) {
        int list1[256];
        int list2[256];
        
        memset(list1, -1, sizeof(list1));
        memset(list2, -1, sizeof(list2));
        
        for(int i=0; i<s.length(); i++){
            if(list1[s[i]] != list2[t[i]])  return false;
            
            list1[s[i]] = i;
            list2[t[i]] = i;
        }
        
        return true;
    }
};
```