Skip to content
ΣDSA Patterns
Menu
Language

Hashing

Guide 5 of 6 · Path 5 of 6

Interactive

Mental model

A worked animation for this problem. Scrub steps or press space to pause; re-tell the invariant out loud.

Step 1 of 6
a
n
a
g
r
a
m

t = nagaram

Valid anagram: same multiset of letters. Count s, then spend t.

Demo preview: These solutions pass the automated test suite but have not been human-reviewed. Treat trade-offs and prose as draft.

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

Unverified
Time O(n)Space O(1)

Idea. 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.

Solution
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