Bird
Raised Fist0
DSA C++programming

Count Words with Given Prefix in DSA C++

Choose your learning style10 modes available
Mental Model
We want to find how many words start with a certain beginning part. We look through all words and count those that begin with that prefix.
Analogy: Imagine a library where you want to find how many books start with the letter 'A'. You scan the titles and count each one starting with 'A'.
Words: [apple, ape, april, bat, ball]
Prefix: ap
Count: ?
Dry Run Walkthrough
Input: words: [apple, ape, april, bat, ball], prefix: 'ap'
Goal: Count how many words start with 'ap'
Step 1: Check word 'apple' if it starts with 'ap'
apple -> starts with 'ap' -> count = 1
Why: We found one word starting with the prefix
Step 2: Check word 'ape' if it starts with 'ap'
apple, ape -> both start with 'ap' -> count = 2
Why: Another word matches the prefix
Step 3: Check word 'april' if it starts with 'ap'
apple, ape, april -> all start with 'ap' -> count = 3
Why: Third word matches prefix
Step 4: Check word 'bat' if it starts with 'ap'
apple, ape, april, bat -> bat does not start with 'ap' -> count = 3
Why: No increase because 'bat' does not match
Step 5: Check word 'ball' if it starts with 'ap'
apple, ape, april, bat, ball -> ball does not start with 'ap' -> count = 3
Why: No increase because 'ball' does not match
Result:
Count = 3
Annotated Code
DSA C++
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// Function to count words starting with given prefix
int countWordsWithPrefix(const vector<string>& words, const string& prefix) {
    int count = 0;
    for (const string& word : words) {
        // Check if word length is at least prefix length
        if (word.size() >= prefix.size()) {
            // Compare prefix part of word with prefix
            if (word.compare(0, prefix.size(), prefix) == 0) {
                count++; // Increment count if prefix matches
            }
        }
    }
    return count;
}

int main() {
    vector<string> words = {"apple", "ape", "april", "bat", "ball"};
    string prefix = "ap";
    int result = countWordsWithPrefix(words, prefix);
    cout << "Count = " << result << endl;
    return 0;
}
for (const string& word : words) {
iterate over each word to check prefix
if (word.size() >= prefix.size()) {
skip words shorter than prefix to avoid errors
if (word.compare(0, prefix.size(), prefix) == 0) {
check if word starts with prefix
count++;
increment count for matching prefix
OutputSuccess
Count = 3
Complexity Analysis
Time: O(n * m) because we check each of the n words and compare up to m characters of the prefix
Space: O(1) because we only use a few variables for counting and comparisons
vs Alternative: A naive approach is similar here; using a trie could improve prefix queries but adds complexity and space
Edge Cases
empty words list
count remains zero because no words to check
DSA C++
for (const string& word : words) {
prefix longer than some words
those shorter words are skipped safely by size check
DSA C++
if (word.size() >= prefix.size()) {
no words match prefix
count remains zero after checking all words
DSA C++
if (word.compare(0, prefix.size(), prefix) == 0) {
When to Use This Pattern
When you need to count or find words starting with a certain beginning, look for prefix matching patterns because they simplify filtering words.
Common Mistakes
Mistake: Not checking if word length is at least prefix length before comparing
Fix: Add a length check to avoid out-of-range errors
Mistake: Using substring extraction instead of compare, which is less efficient
Fix: Use string.compare to check prefix without extra substring creation
Summary
Counts how many words in a list start with a given prefix.
Use when you want to filter or count words by their starting letters.
Check word length first, then compare prefix directly for efficient matching.

Practice

(1/5)
1. What does the problem "Count Words with Given Prefix" ask you to do?
easy
A. Count how many words in a list start with a specific prefix
B. Count the total number of words in a list
C. Find the longest word in a list
D. Replace the prefix in all words with another string

Solution

  1. Step 1: Understand the problem statement

    The problem asks to find how many words start with a given prefix from a list of words.
  2. Step 2: Identify the key operation

    We need to check each word and count those that begin with the prefix.
  3. Final Answer:

    Count how many words in a list start with a specific prefix -> Option A
  4. Quick Check:

    Counting words with prefix = Count how many words in a list start with a specific prefix [OK]
Hint: Focus on words starting with prefix, not total words [OK]
Common Mistakes:
  • Counting all words instead of only those with prefix
  • Looking for longest word instead of counting
  • Replacing prefix instead of counting
2. Which of the following C++ code snippets correctly checks if a string word starts with prefix pref?
easy
A. if (word.compare(pref) == 1) { /* starts with prefix */ }
B. if (word == pref) { /* starts with prefix */ }
C. if (word.substr(1, pref.size()) == pref) { /* starts with prefix */ }
D. if (word.find(pref) == 0) { /* starts with prefix */ }

Solution

  1. Step 1: Understand string::find usage

    Using word.find(pref) == 0 checks if pref is found at the start (index 0) of word.
  2. 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.
  3. Final Answer:

    if (word.find(pref) == 0) { /* starts with prefix */ } -> Option D
  4. Quick Check:

    find(pref) == 0 means prefix match [OK]
Hint: Use find(pref) == 0 to check prefix in C++ strings [OK]
Common Mistakes:
  • Using equality instead of prefix check
  • Checking substring from wrong index
  • Misunderstanding compare() return values
3. What is the output of the following C++ code?
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;
medium
A. 3
B. 2
C. 1
D. 4

Solution

  1. 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.
  2. Step 2: Count total matches

    Total words starting with "app" are 3.
  3. Final Answer:

    3 -> Option A
  4. Quick Check:

    Words starting with "app" = 3 [OK]
Hint: Count words where find(prefix) == 0 inside loop [OK]
Common Mistakes:
  • Counting words that contain prefix anywhere
  • Off-by-one errors in counting
  • Ignoring words that exactly equal prefix
4. Identify the error in this C++ code snippet that tries to count words starting with prefix pref:
int count = 0;
for (auto w : words) {
    if (w.find(pref)) {
        count++;
    }
}
medium
A. The count variable should be initialized to -1
B. The loop variable should be a reference: auto& w
C. The condition should check if w.find(pref) == 0, not just w.find(pref)
D. The find function should be replaced with substr

Solution

  1. 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.
  2. Step 2: Correct condition for prefix check

    We must check if w.find(pref) == 0 to confirm prefix at start.
  3. Final Answer:

    The condition should check if w.find(pref) == 0, not just w.find(pref) -> Option C
  4. Quick Check:

    Check find() == 0 for prefix [OK]
Hint: Always compare find() result to 0 for prefix check [OK]
Common Mistakes:
  • Using if(w.find(pref)) which fails for prefix at start
  • Not using reference in loop (less critical here)
  • Initializing count incorrectly
5. Given a list of words and a prefix, how would you efficiently count words starting with the prefix if the list is very large and queried multiple times?
Choose the best approach.
hard
A. Check each word with find(prefix) == 0 every time a query comes
B. Use a Trie (prefix tree) to store words and count prefix matches quickly
C. Sort the list and use binary search to find prefix range each time
D. Store words in a hash set and check prefix membership

Solution

  1. Step 1: Understand repeated prefix queries

    Checking each word every time is slow for large lists and many queries.
  2. 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.
  3. 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.
  4. Final Answer:

    Use a Trie (prefix tree) to store words and count prefix matches quickly -> Option B
  5. Quick Check:

    Trie = fast prefix counting [OK]
Hint: Use Trie for fast repeated prefix counts [OK]
Common Mistakes:
  • Checking all words each query (slow)
  • Using hash set which doesn't support prefix queries
  • Ignoring Trie advantages for prefix problems
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard