LeetCode 242. Valid Anagram
題目:
根據題目敘述,會給定兩個字串 s 和 t,你必須判斷 s 是不是 t 的 anagram,若是則回傳 true,不是則回傳 false。
s 必須符合以下兩個條件才能算是 t 的 anagram :
- s 和 t 字串長度相同
- 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 個字母的時候,所以絕大情況下這個做法都是實際效能更高的。
- 時間複雜度 O(N),如何證明檢查存在鍵與拿取存放的時間複雜度請 參考我的另一篇文章 - PHP Array
- 空間複雜度 O(N)
PHP 程式碼:
如果您喜歡我的文章,歡迎幫我在下面按5下讚!感謝您的鼓勵和支持!
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment