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.
๐ก 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
| 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
- 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
minof the two tallies for cows. - Longest Harmonious Subsequence โ count values; for each
v, combinecount[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
- Two tally tables. For Bulls and Cows or the anagram problem, draw both frequency tables and read the answer off the per-letter differences.
- 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: Count the exact position matches (bulls) in one pass, then for everything left over, match digit values regardless of position by taking, for each digit, the smaller of "how many times it's unmatched in the secret" and "how many times it's unmatched in the guess."
Problem, rephrased
You and a friend are playing a code-breaking game. You lock in a secret 4-digit combination, and on each turn your friend submits a guessed combination. You don't reveal the secret โ instead you hand back a two-number scoreboard:
- A direct hit (a "bull") is a digit your friend placed in the exact right slot: same digit, same position.
- A misplaced hit (a "cow") is a digit that does appear in your secret but your friend put it in the wrong slot.
Crucially, each digit in the secret can be claimed at most once, and a single guessed digit is either a bull or a cow โ never both. Your friend uses the scoreboard turn after turn to home in on the answer.
Write a function that takes the secret and the guess (two equal-length digit strings) and returns the score as "xAyB", where x is the number of bulls and y is the number of cows.
secret |
guess |
Output | Reading it |
|---|---|---|---|
"1807" |
"7810" |
"1A3B" |
1 bull (8), 3 cows (1, 0, 7 are present but misplaced) |
"1123" |
"0111" |
"1A1B" |
The 3rd-slot 1 is a bull; one other guessed 1 can still be a cow |
"4271" |
"1234" |
"1A2B" |
1 bull (2); 4 and 1 are misplaced cows, 3 isn't in the secret |
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