Featured image of post 從LeetCode學演算法 - 71 Hash Table (4)

從LeetCode學演算法 - 71 Hash Table (4)

0205. Isomorphic Strings (Easy)

Question

Given two strings *s * and *t *, determine if they are isomorphic.

Two strings 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

1
2
Input: s = "egg", t = "add"
Output: true

Example 2

1
2
Input: s = "foo", t = "bar"
Output: false

Example 3

1
2
Input: s = "paper", t = "title"
Output: true

分析/解題

給定兩個字串s和t,試判斷它們是否同構(isomorphic)
若s和t同構,表示可以透過將s中的相同的字元轉換成另一個字元,
保有其順序,使得在轉換過後的s和t完全一樣。
兩個不同的字元不可映射到相同的字元
但一個字元可以映射到原來的字元(也就是不變)。

這個題目簡而言之,就是在找尋用特定方式轉換對應字的方法,
比如範例中的paper -> title有以下的轉換對應:
p <-> t, a <-> i, e <-> l, r <-> e

由於同構並沒有限制轉換方向,所以既要轉得過去,也要轉得回來,
這代表了他們對應必須要1對1才行。
因此,我們可以想到以下的方式:

  1. 先檢查兩邊長度,不相等則直接回傳False (怎麼轉都沒用XD)
  2. 可以選擇建立一個HashMap/Dict額外處理雙向 的對應檢查,
    或者選擇開出2個陣列/Dict(也可用串列,不過要自己轉換) 來做檢查。
  3. 每次從s, t中各取出一個字元 (假設現在在index i ):
    3-1. 兩字元都未進入 陣列對應 -> 將s[i]t[i] 放入兩個陣列的對應
    3-2. 兩字元都進入 陣列對應 -> 檢查s[i] 是否對到t[i]t[i] 是否對到s[i]
    (只要其中一個對錯或沒對到,即可判定為False )
  4. 當所有字元均檢查完,表示順利全數對應到,回傳True

簡單吧!
在Java的部份,
我們可以直接利用char可以自動轉換成int當作陣列的index。
沒有對應則會拿到預設值(0),依此寫成以下程式碼:

Java

Python的部份,方便起見我們使用了dict來紀錄,
預設值使用get放入0。

另外提供一個特別的用法,可以使用maketranstranslate
來進行兩個表的轉換。但由於中間可能有重複,
所以要先經過set(刪去重複)和list, join 以後,
重新依照原先的字母排列排序(用key=s.index)
最終看看s經過轉換以後是否和t相同。

Python

面試實際可能會遇到的問題

「時間/空間複雜度?」
(O(N)/O(N), 但空間複雜度最高取決於實際用到的字數,
亦可視為O(1),因限縮在ASCII Code的話也才128種類)

相似及延伸

Special Thanks suggestions/corrections from viewers:
(歡迎提供意見協助更正歐~)

從LeetCode學演算法,我們下次見囉,掰~

感謝大家對這系列文章的支持!這邊跟大家自我工商一下:

筆者開設的系列同名線上課程:
「從Leetcode學演算法|基礎篇」已經上線啦! 在這堂課中,你將學會利用十種演算法/資料結構來優化解題過程,
並實際完整練習20題 精選考古題,
進而逐漸提升到不需提示也可以突破白板題,取得工作門票!
限額早鳥連結: https://hiskio.com/courses/319?promo_code=13L5QJE

問卷抽書&取得上架通知: https://pse.is/MS2J2
如果你對線上課程不放心,
也可以先來12/17(二) 我在天瓏分享的講座看看!
講座連結: https://pse.is/JS3LJ

共發表了 171 篇文章 ‧ 總計 311.6k
使用 Hugo 建立
主題 StackJimmy 設計