Easy 242. Valid Anagram
In this blog I will share a solution to the Valid Anagram problem.
2025-01-15
leetcodejavascript
Valid Anagram
- link: https://leetcode.com/problems/valid-anagram/
- topic: string, hash table
- difficulty: easy
題目描述
給定兩個字串 s 和 t,判斷 t 是否為 s 的重組字(即字母重新排列後可以得到的字串)。
Example 1:
Input: s = "anagram", t = "nagaram"
Output: true
Explanation: "anagram" 重新排列後可以得到 "nagaram"
Example 2:
Input: s = "rat", t = "car"
Output: false
Explanation: "rat" 不可能重新排列得到 "car"
解題思路
要判斷兩個字串是否為重組字(Anagram),我們需要:
- 長度檢查
- 如果兩個字串長度不同,一定不是重組字
- 這是最基本且必要的檢查
- 字母頻率統計
- 使用 Map 記錄第一個字串中每個字母出現的次數
- 例如 "anagram" 會得到:
Map { 'a' => 3, 'n' => 1, 'g' => 1, 'r' => 1, 'm' => 1 }
- 字母頻率驗證
- 檢查第二個字串的每個字母
- 如果字母不存在或次數為 0,代表不是重組字
- 每次檢查後減少該字母的計數
程式碼
const isAnagram = (s, t) => {
// 長度檢查
if (s.length !== t.length) return false;
// 建立頻率 Map
const freq = new Map();
// 統計第一個字串
for (const char of s) {
freq.set(char, (freq.get(char) || 0) + 1);
}
// 驗證第二個字串
for (const char of t) {
// 字母不存在或次數為 0
if (!freq.has(char) || freq.get(char) === 0) {
return false;
}
freq.set(char, freq.get(char) - 1);
}
return true;
};
複雜度分析
- 時間複雜度:O(n),只需要遍歷每個字串一次
- 空間複雜度:O(1),因為最多只需要 26 個字母的空間
解題重點
- 效能考量
- 使用 Map 提供最佳效能
- 提早返回可以避免不必要的運算
- 固定大小的空間複雜度
- 實作建議
- 先檢查基本條件(長度)
- 使用 Map 而不是物件,效能更好
- 善用提早返回來優化程式流程