</> MAANG.io
coding interview ยท 101

Foundations

Master coding interviews with comprehensive coverage of data structures, algorithms, and problem-solving techniques. Progress from fundamentals to advanced topics with expertly curated content.

0/255 solved 0% complete

Hashing Fundamentals

What is this?

This is where you learn the three everyday jobs a hash structure does. Use a set to check "have I seen this before?", a Counter to answer "how many of each do I have?", and a canonical key to lump together things that are secretly the same (like words that are anagrams). Each one replaces a slow, item-by-item comparison with one quick pass.

flowchart TD A["Hashing Fundamentals"] --> B["Set for distinctness"] A --> C["Counter for how many of each"] A --> D["Canonical key for grouping"] D --> E["Equivalent items share one key"]

๐Ÿ’ก Fun fact: The "group things that are secretly the same" trick has a famous twist โ€” to detect anagrams you can multiply a prime number per letter, since every word maps to a unique product. This is essentially the Fundamental Theorem of Arithmetic, a 2000-year-old idea from Euclid, repurposed as a hash key.

๐Ÿ”“ The 5 problems in this chapter are free. Sign in with Google or Microsoft to start solving.


Core idea: Before the clever "what to store" tricks, master the three everyday uses of a hash structure: a set to test distinctness, a Counter to tally "how many of each", and a canonical key to group items that are secretly the same. Each turns an O(nยฒ) scan into one O(n) pass.


The three reflexes

The three reflexes: distinctness uses a set (have I seen it?, O(1) membership); how many? uses a Counter (value to count, O(1) tally); equivalence uses a canonical key (normalize then group, O(1) bucketing)

Reflex Trigger phrase Tool
Set "distinct / unique / seen" set()
Frequency "how many of each / most common / counts" collections.Counter
Canonical key "group the ones that are the same under โ€ฆ" dict keyed by a normalized form

The five problems

Hashing fundamentals branches into five problems: Distribute Candies (set: distinct count), Min Steps to Make Anagram (count diff), Bulls and Cows (two count tables), Longest Harmonious Subsequence (count adjacent values), Group Shifted Strings (canonical key)

  • Distribute Candies โ€” a set gives the distinct-type count; answer min(distinct, n//2).
  • Minimum Steps to Make Anagram โ€” subtract two frequency tables; the deficit is the answer.
  • Bulls and Cows โ€” bulls by position, then count the leftover digits and sum min of the two tallies for cows.
  • Longest Harmonious Subsequence โ€” count values; for each v, combine count[v] + count[v+1].
  • Group Shifted Strings โ€” build a canonical key (mod-26 difference tuple) and group by it.

The pattern

Counting collapses "compare every element to every other" into "tally once, then read the tallies." A set answers membership in O(1). And when items are equivalent under some transformation (a shift, a sort, a rotation), compute a canonical form and let the map group them โ€” the same trick behind Group Anagrams.


๐Ÿ““ Draw it yourself

  1. Two tally tables. For Bulls and Cows or the anagram problem, draw both frequency tables and read the answer off the per-letter differences.
  2. Canonical key. For Group Shifted Strings, write a few strings and their difference-tuple keys; watch equivalent ones land in the same bucket.

Snap photos and embed them with the /host-diagrams skill.


Key takeaways

  • Three reflexes: set (distinct), Counter (how many), canonical key (group equivalents).
  • Counting beats nested comparison โ€” tally once in O(n), then answer questions off the tallies.
  • A canonical key turns "are these equivalent?" into "do they hash the same?"
  • Why it matters: these are the bread-and-butter hash moves every harder problem composes from.

Order: Distribute Candies โ†’ Min Steps to Make Anagram โ†’ Bulls and Cows โ†’ Longest Harmonious Subsequence โ†’ Group Shifted Strings.

Core idea: A harmonious subsequence is built from exactly two adjacent values v and v+1, so you never reason about elements one at a time โ€” you just count how often each value appears and, for every v, add count[v] + count[v+1].

Problem, rephrased

LeetCode 594. We call an array harmonious when the difference between its largest and smallest element is exactly 1 โ€” not zero, not two, exactly one. Given an integer array, return the length of the longest harmonious subsequence.

A subsequence keeps the original order but lets you skip elements โ€” they need not be contiguous. The practical consequence: if you decide your harmonious subsequence will be made of the values v and v+1, the best you can do is grab every occurrence of v and every occurrence of v+1. There's no reason to leave any behind, and you can't include any third value without breaking the "max โˆ’ min = 1" rule.

So the whole problem collapses to: pick the pair of adjacent values whose combined occurrence count is largest.

Input Output Why
[1,3,2,2,5,2,3,7] 5 Pick values 2 and 3: three 2s + two 3s = 5 โ†’ subsequence [2,2,2,3,3]
[1,2,3,4] 2 Every adjacent pair (1,2), (2,3), (3,4) gives 1+1 = 2
[1,1,1,1] 0 Only one distinct value; no v has its neighbor v+1 present โ†’ no harmonious pair

Sign in to continue reading

The rest of this lesson is available with a free account. Signing in with Google or Microsoft is free.

Sign in to read the full lesson

Sign in to MAANG.io

Use your Google or Microsoft account โ€” no password to remember.

Continue with Google Continue with Microsoft

Please accept the terms above to continue.