↓快轉到主要內容
  1. LeetCode/

LeetCode 205: Isomorphic Strings

·1 分鐘· ·
LeetCode Easy Hash-Table String
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-21

  • 提交紀錄:Wrong Answer ×2 → Accepted ×2 → Wrong Answer → Accepted ×2

解題思路
#

同構就是雙射:s 的每個字元只對應 t 的一個字元,反過來也是。len(set(s)) == len(set(t)) == len(set(zip(s, t))):配對數比字元種類多,代表有字元對到兩個不同的字元(Hash Table 模板五)。另一種寫法是把每個字元換成「第一次出現的 index」,兩個字串轉換後相同就成立。

我的嘗試
#

前幾版把每個字元換成「第一次出現的 index」再比較:

  • 第一版兩次都對 s 編碼,t 沒用到,永遠回傳 True:"aa"、"ca" 也是 True。
  • 第二版改成編碼 t,但數字直接接在一起沒有分隔,index 到兩位數就會撞:"abcdefghijkbl" 和 "abcdefghijklc" 最後兩個字元分別編成 1, 12 和 11, 2,都是 "112",回傳 True,答案 False。
  • 加上空白分隔就 AC 了。後來改寫成一行的 set 比較,第一次忘了寫 return。

正確解法
#

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        return len(set(s)) == len(set(t)) == len(set(zip(s, t)))

複雜度
#

時間 O(n),空間 O(k)。

要特別避免的錯誤
#

  • 用 index 編碼時,數字之間要加分隔符號,不然 1 + 12 和 11 + 2 都是 112。
  • 兩個字串都要編碼,不要對 s 做兩次。

面試口說整理
#

同構就是兩個方向都要一對一,我比較 s 的字元種類數、t 的字元種類數和 (s[i], t[i]) 配對的種類數,三者相等就成立。時間 O(n)。

相關文章

LeetCode 13: Roman to Integer
·1 分鐘
LeetCode Easy Hash-Table Math String
LeetCode 13 解題筆記:從左到右加每個符號的值,如果它比右邊的符號小就改成減
LeetCode 171: Excel Sheet Column Number
·1 分鐘
LeetCode Easy Math String
LeetCode 171 解題筆記:從左到右 res = res × 26 + 字母的值(A = 1)
LeetCode 202: Happy Number
·1 分鐘
LeetCode Easy Hash-Table Math Two-Pointers Floyds-Cycle-Finding-Algorithm
LeetCode 202 解題筆記:一直取位數平方和,會走到 1 或進入環;用集合記看過的數,或用快慢指針判圈
LeetCode 217: Contains Duplicate
·1 分鐘
LeetCode Easy Array Hash-Table Sorting
LeetCode 217 解題筆記:轉成 set 後長度變短就代表有重複
LeetCode 219: Contains Duplicate II
·1 分鐘
LeetCode Easy Array Hash-Table Sliding-Window
LeetCode 219 解題筆記:雜湊表記錄每個值最後一次出現的位置,只需要跟最近的那次比距離
LeetCode 141: Linked List Cycle
·1 分鐘
LeetCode Easy Hash-Table Linked-List Two-Pointers Floyds-Cycle-Finding-Algorithm
LeetCode 141 解題筆記:Floyd 判圈,快指針一次兩步、慢指針一次一步,有環就一定會相遇;兩個都要從自己的位置往前走