Easy草稿★★★★★O(n^2) 時間 · O(1) 空間
Hash TableString
Patterns#️⃣ 雜湊
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

205Isomorphic StringsArrays & HashingEasyArrays & Hashing

給定兩個字串 st,判斷它們是否同構。兩個字串同構意味著 s 中的字元可以被替換成 t 中對應的字元,且映射必須是一對一的(不同字元不能映射到同一個字元)。

Example:

Input: s = “egg”, t = “add” Output: true

Intuition

TIP

核心思路:建立雙向映射,確保 s → tt → s 的映射都是一對一的。

Approaches

1. Two HashMaps — O(n) / O(n)
  • Idea: 用兩個 HashMap 分別記錄 s → tt → s 的映射
  • Time: O(n) - 遍歷一次字串
  • Space: O(n) - 兩個 Map
class Solution {
    fun isIsomorphic(s: String, t: String): Boolean {
        val mapST = HashMap<Char, Char>()
        val mapTS = HashMap<Char, Char>()
        for (i in s.indices) {
            val cs = s[i]
            val ct = t[i]
            if (mapST.containsKey(cs) && mapST[cs] != ct) return false
            if (mapTS.containsKey(ct) && mapTS[ct] != cs) return false
            mapST[cs] = ct
            mapTS[ct] = cs
        }
        return true
    }
}
⭐ 2. Compare First-Occurrence Index — O(n^2) / O(1)
  • Idea: 對每個位置 i,比較 s[i]s 中首次出現的位置和 t[i]t 中首次出現的位置,若不同則不同構
  • Time: O(n^2) - indexOf 每次 O(n);但概念簡潔
  • Space: O(1) - 不需要額外空間
class Solution {
    fun isIsomorphic(s: String, t: String): Boolean {
        for (i in s.indices) {
            if (s.indexOf(s[i]) != t.indexOf(t[i])) return false
        }
        return true
    }
}

WARNING

雖然首次出現位置法概念簡潔,但因 indexOf 是 O(n) 操作,整體時間複雜度為 O(n^2)。面試中推薦使用雙 HashMap 的 O(n) 解法。

Note: Array instead of HashMap

因為字元集有限(ASCII 128),可以用陣列代替 HashMap 來加速。

class Solution {
    fun isIsomorphic(s: String, t: String): Boolean {
        val mapS = IntArray(128)
        val mapT = IntArray(128)
        for (i in s.indices) {
            if (mapS[s[i].code] != mapT[t[i].code]) return false
            mapS[s[i].code] = i + 1
            mapT[t[i].code] = i + 1
        }
        return true
    }
}

🔑 Takeaways