Count Words with Given Prefix in DSA C++ - Time & Space Complexity
We want to know how long it takes to count words that start with a certain prefix in a list.
How does the time needed change when the list grows bigger?
Analyze the time complexity of the following code snippet.
int countWordsWithPrefix(const std::vector<std::string>& words, const std::string& prefix) {
int count = 0;
for (const auto& word : words) {
if (word.compare(0, prefix.size(), prefix) == 0) {
count++;
}
}
return count;
}
This code counts how many words in the list start with the given prefix.
- Primary operation: Loop through all words and compare prefix with each word's start.
- How many times: Once for each word in the list (n times).
As the number of words grows, the time to check all words grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 prefix checks |
| 100 | About 100 prefix checks |
| 1000 | About 1000 prefix checks |
Pattern observation: The operations grow directly with the number of words; doubling words doubles work.
Time Complexity: O(n * m)
This means the time grows with the number of words (n) and the length of the prefix (m), because each word's start is checked against the prefix.
[X] Wrong: "Checking the prefix is always O(1) so the whole is O(n)."
[OK] Correct: Each prefix check compares up to m characters, so it takes O(m) time, not constant time.
Understanding how loops and string comparisons affect time helps you explain and improve search tasks in real projects.
"What if the words were stored in a trie data structure? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem statement
The problem asks to find how many words start with a given prefix from a list of words.Step 2: Identify the key operation
We need to check each word and count those that begin with the prefix.Final Answer:
Count how many words in a list start with a specific prefix -> Option AQuick Check:
Counting words with prefix = Count how many words in a list start with a specific prefix [OK]
- Counting all words instead of only those with prefix
- Looking for longest word instead of counting
- Replacing prefix instead of counting
word starts with prefix pref?Solution
Step 1: Understand string::find usage
Usingword.find(pref) == 0checks ifprefis found at the start (index 0) ofword.Step 2: Check other options
if (word == pref) { /* starts with prefix */ } checks equality, not prefix. if (word.substr(1, pref.size()) == pref) { /* starts with prefix */ } checks substring starting at index 1, which is wrong. if (word.compare(pref) == 1) { /* starts with prefix */ } compares strings but result 1 means greater, not prefix.Final Answer:
if (word.find(pref) == 0) { /* starts with prefix */ } -> Option DQuick Check:
find(pref) == 0 means prefix match [OK]
- Using equality instead of prefix check
- Checking substring from wrong index
- Misunderstanding compare() return values
std::vector words = {"apple", "app", "application", "banana"};
std::string prefix = "app";
int count = 0;
for (const auto& w : words) {
if (w.find(prefix) == 0) {
count++;
}
}
std::cout << count << std::endl;Solution
Step 1: Check each word for prefix "app"
"apple" starts with "app" (count=1), "app" starts with "app" (count=2), "application" starts with "app" (count=3), "banana" does not.Step 2: Count total matches
Total words starting with "app" are 3.Final Answer:
3 -> Option AQuick Check:
Words starting with "app" = 3 [OK]
- Counting words that contain prefix anywhere
- Off-by-one errors in counting
- Ignoring words that exactly equal prefix
pref:int count = 0;
for (auto w : words) {
if (w.find(pref)) {
count++;
}
}Solution
Step 1: Understand find() return value
find() returns position or npos. Using if(w.find(pref)) treats 0 as false, so words starting at index 0 are skipped.Step 2: Correct condition for prefix check
We must check if w.find(pref) == 0 to confirm prefix at start.Final Answer:
The condition should check if w.find(pref) == 0, not just w.find(pref) -> Option CQuick Check:
Check find() == 0 for prefix [OK]
- Using if(w.find(pref)) which fails for prefix at start
- Not using reference in loop (less critical here)
- Initializing count incorrectly
Choose the best approach.
Solution
Step 1: Understand repeated prefix queries
Checking each word every time is slow for large lists and many queries.Step 2: Use Trie data structure
A Trie stores words by prefixes, allowing fast counting of words with given prefix in O(length of prefix) time.Step 3: Evaluate other options
Binary search after sorting helps but is less efficient for many queries. Hash set doesn't support prefix queries efficiently.Final Answer:
Use a Trie (prefix tree) to store words and count prefix matches quickly -> Option BQuick Check:
Trie = fast prefix counting [OK]
- Checking all words each query (slow)
- Using hash set which doesn't support prefix queries
- Ignoring Trie advantages for prefix problems
Ready to prove it?
Pass the test and this pattern moves unknown
