Valid Anagram
Problem (restated)
Return true if t is an anagram of s (same characters with same frequencies).
Intuition
Anagrams share a multiset of characters. Compare frequency maps or sorted forms.
Approaches
Character counts
UnverifiedIdea. Count letters in s, decrement with t; all zeros means anagram. Assumes lowercase English.
Walkthrough. “anagram” / “nagaram” → counts cancel → true.
Trade-offs. Sorting is simpler but O(n log n). Unicode needs a hash map.
export function isAnagram(s: string, t: string): boolean {
if (s.length !== t.length) return false;
const cnt = new Array<number>(26).fill(0);
for (let i = 0; i < s.length; i++) {
cnt[s.charCodeAt(i)! - 97]!++;
cnt[t.charCodeAt(i)! - 97]!--;
}
return cnt.every((c) => c === 0);
}
export function isAnagram(s: string, t: string): boolean {
if (s.length !== t.length) return false;
const cnt = new Array<number>(26).fill(0);
for (let i = 0; i < s.length; i++) {
cnt[s.charCodeAt(i)! - 97]!++;
cnt[t.charCodeAt(i)! - 97]!--;
}
return cnt.every((c) => c === 0);
}
Template connection
Frequency signature / count array from the Hashing template (same key idea as group anagrams).
Reflection
- Equal frequencies are a count array or a map. When is sorting both strings enough?
- Rejecting different lengths up front makes which inputs O(1)?
- This problem has no case folding. Did you still check that
sandthave the same length?