Easy草稿★★★★★O(n) 時間 · O(1) 空間
StringHash TableSorting
Patterns#️⃣ 雜湊🔢 排序後處理
尚未複習過

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

242Valid AnagramArrays & HashingEasyArrays & Hashing

給定兩個字串 st,判斷 t 是否為 s 的 anagram(字母重新排列)。兩字串只包含小寫英文字母。

Example:

Input: s = “anagram”, t = “nagaram” Output: true

Intuition

TIP

核心思路:Anagram 就是字母出現頻率完全相同——用計數陣列或排序後比較。

Approaches

1. Sorting — O(n log n) / O(n)
  • Idea: 將兩個字串排序後直接比較,若相同則為 anagram
  • Time: O(n log n) - 排序主導
  • Space: O(n) - 排序需要額外空間(字串轉陣列)
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        if (s.length != t.length) return false
        val sArr = s.toCharArray().also { it.sort() }
        val tArr = t.toCharArray().also { it.sort() }
        return sArr.contentEquals(tArr)
    }
}
⭐ 2. Character Count Array — O(n) / O(1)
  • Idea: 用大小 26 的陣列計數,遍歷 s 時加一、遍歷 t 時減一,最終所有計數應為零
  • Time: O(n) - 各遍歷一次
  • Space: O(1) - 固定大小 26 的陣列
class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        if (s.length != t.length) return false
        val count = IntArray(26)
        for (i in s.indices) {
            count[s[i] - 'a']++
            count[t[i] - 'a']--
        }
        return count.all { it == 0 }
    }
}

WARNING

Follow-up:如果輸入包含 Unicode 字元,固定大小陣列不適用,需改用 HashMap<Char, Int> 來計數。

🔑 Takeaways