題目:

官網題目連結

根據題目敘述,會給定兩個字串 s 和 t,你必須判斷 s 是不是 t 的 anagram,若是則回傳 true,不是則回傳 false。

s 必須符合以下兩個條件才能算是 t 的 anagram :

  1. s 和 t 字串長度相同
  2. s 和 t 有相同的字元數且各字元出現次數相同

例如輸入 s = “anagram”, t = “nagaram”,應回傳 true。
輸入 s = “rat”, t = “car”,則回傳 false

  • 1 <= s.length, t.length <= 5*10^4
  • s 和 t 都只由小寫英文字組成。

解法:

原本想到的作法是遍歷 s 並記錄 s 中各字母出現次數,之後再遍歷 t 並用紀錄的陣列去減,如果有新字母或出現次數變成負數的情況就代表兩者不相同,但這樣做會導致最差情況(s 是 t 的 anagram)必須遍歷兩次 s 長度。

後來發現其實根本不需要分開遍歷,因為你可以從記錄 s 變成紀錄兩者差距,也就是 s 有的就加,t 有的就減,這樣你就只需要遍歷找完的字母出現次數差異陣列,發現有字母出現次數不等於 0 的時候就代表失敗。雖然最差情況(s 是 t 的 anagram 且字母出現次數不重複)也是遍歷兩次 s 長度,但這只會發生在剛好 26 個字母的時候,所以絕大情況下這個做法都是實際效能更高的。

PHP 程式碼: