Implement Trie II (Count Prefix)
A medium Trie problem included in Striver A2Z. Below: the roles whose interviews prioritise this topic, and how to practise it.
- Topic
- Trie
- Sheets
- 1
- Core for
- 7 roles
- Platform
- GeeksforGeeks
The problem
Design a trie that supports inserting strings, counting how many inserted strings start with a given prefix, and counting how many inserted strings exactly match a given string.
Example 1
- Input
- insert("apple"), insert("app"), countPrefix("ap"), countExact("app")
- Output
- 2, 2
- Why
- Two strings start with 'ap' ('apple' and 'app'). Two strings exactly equal 'app'.
Example 2
- Input
- insert("abc"), insert("abc"), countExact("abc"), countPrefix("ab")
- Output
- 2, 2
Constraints
- 1 <= total length of all inserted strings <= 10^4
- Strings consist of lowercase English letters
- At most 10^4 calls in total
How to think about it
Updated 2026-09-09Standard tries store presence as a boolean, but counting prefix and word occurrences merely requires turning presence flags into counters. Maintaining a pass-through counter on every node and an end-word counter at the leaf lets both prefix and exact counts be read immediately upon completing the string walk without inspecting children.
Approaches, worst first
Hash map frequency counting
time O(L) · space O(total characters * L)
Record exact word frequencies in one hash map and increment prefix counts across all prefix slices in a second map. Exact count is immediate, but generating every prefix substring during insertions incurs redundant string allocations.
Dual-counter trie nodesWrite this one
time O(L) · space O(total characters)
Each trie node holds two integers: wordsEndedHere and prefixCount. During insertion, increment prefixCount on every node traversed and wordsEndedHere at the end. Both query operations navigate the prefix path and return the corresponding integer.
Where people lose marks · 3
- Returning 0 prematurely without checking if the prefix exists; attempting to read counters off a null node path causes null pointer exceptions.
- Incrementing prefix counts on insertion before verifying successful node creation, leaving corrupted counts if an operation fails or rolls back.
- Confusing exact match counter with prefix counter when a query string happens to match both an entire word and a prefix of longer words.
The theory behind it
Trie — the ground this problem stands on. All Trie problems
What Trie is
A trie, also called a prefix tree, is a tree structured for storing words character by character. Instead of storing entire words in individual nodes, each step down a branch represents a single letter. Words that share the same beginning, like car, card, and care, share the exact same starting path down the tree. A special boolean marker sits at the end of each valid word to show that a complete word terminates at that letter.
When to reach for it
Reach for a trie when questions involve prefix lookups, dictionary word searches, autocomplete engines, or matching prefixes against a body of text. Prompts asking whether any word in a dictionary begins with a given prefix, or searching for words on a Boggle board grid, point directly to a trie. It also applies to bitwise tasks, such as finding the maximum XOR pair among integers by treating numbers as binary prefixes.
How the pattern works
Represent each trie node with an array or hash map of child links, plus a boolean flag marking if a complete word ends at that node. When inserting, start at the root and walk down character by character, creating new child nodes whenever a path does not exist yet, then mark the final node as a word ending. When searching, follow the characters; if any child link is missing, the word or prefix does not exist. If all characters match, check the boolean flag to distinguish between a full word and a partial prefix.
What each operation costs
| Operation | Time |
|---|---|
| insert word of length l into trie | O(l) |
| search for full word of length l | O(l) |
| check if any word begins with prefix of length l | O(l) |
What usually goes wrong with Trie
- Confusing prefix matches with full word matches by returning true when characters exist but the end-of-word flag on the final node was never set.
- Allocating fixed 26-slot arrays for child pointers without verifying that all input characters are strictly lowercase English letters.
- Forgetting to prune unvisited branches during board searches, leading to time limit exceeded errors on grids with large word sets.
Which roles need this problem
Trie is a core topic for these 7 roles — if you're targeting one of them, this problem is early in your path, not optional.
Secondary for 2 more roles, including Information Retrieval Engineer, Storage Engineer.
Track this in your role's order
Pick your target role and all 370 problems — including this one — resequence to what that interview actually asks. Free.
Start freeMore Trie problems
Problem set and role mapping as of .