起床時間:0530
今天抽到這題,我的第一步思路就對了:)
給你兩個字串 s 和 t,判斷它們是否是 anagram(字母重組詞)。
定義:如果兩個字串包含的字母完全相同,且每個字母出現的次數也相同,只是排列順序可以不一樣,那它們就是 anagram。
要求:回傳 True 或 False。
例子:
s = "anagram", t = "nagaram" → True
s = "rat", t = "car" → False
字數不同直接false
把s丟到一個HashTable,紀錄每個字母出現幾次
把t也丟一個HashTable,紀錄每個字母出現幾次
遍歷1~26英文字母,比對出現次數
Invariant/狀態
在 Counter 解法中,count[i] 代表字母 i 在 s 與 t 出現次數的淨差。
**Invariant:**遍歷到任意位置時,count 真實反映了「目前為止兩字串的頻率差」。最後全為 0 才是 anagram。
為何降到 O(n)
因為我們只做兩趟線性掃描:
s:+1
t:-1
檢查陣列是否全零也是 O(26) = O(1)。
所以總複雜度 O(n),比排序 O(n log n) 更快。
邊界/易錯
是一種資料結構(data structure),用來存放 key–value 配對。它透過 hash function 將 key 映射到某個 index,從而快速找到對應的 value。
👉 可以把它想像成一本書的「索引表」,查關鍵字(key)就能直接跳到對應的頁碼(value)。
是 Hash Table 的一種實作(implementation),通常以 class 或物件的形式提供。例如:
在 Java 裡有 HashMap 類別。
在 Python 裡,dict 就是 hash map 的實作。