Count Words with Given Prefix in DSA Go - Time & Space Complexity
We want to understand how long it takes to count words that start with a certain prefix in a list.
The question is: how does the time grow when the list or prefix size changes?
Analyze the time complexity of the following code snippet.
func countPrefix(words []string, prefix string) int {
count := 0
for _, word := range words {
if len(word) >= len(prefix) && word[:len(prefix)] == prefix {
count++
}
}
return count
}
This code counts how many words in the list start with the given prefix.
- Primary operation: Looping through each word in the list.
- How many times: Once for each word, so as many times as the list size (n).
- Secondary operation: Checking prefix by comparing characters up to prefix length (m).
- How many times: Up to prefix length for each word.
As the number of words (n) grows, the loop runs more times. Also, longer prefixes (m) mean more characters to check per word.
| Input Size (n) | Prefix Length (m) | Approx. Operations |
|---|---|---|
| 10 | 3 | About 10 * 3 = 30 checks |
| 100 | 3 | About 100 * 3 = 300 checks |
| 1000 | 3 | About 1000 * 3 = 3000 checks |
Pattern observation: Operations grow linearly with both the number of words and the prefix length.
Time Complexity: O(n * m)
This means the time grows proportionally to the number of words times the length of the prefix.
[X] Wrong: "Checking prefix is always O(1) because prefix is small."
[OK] Correct: Even if prefix is small, it still requires checking each character for every word, so it depends on prefix length and number of words.
Understanding how loops and string checks combine helps you explain your code clearly and shows you know how to analyze performance in real tasks.
"What if we stored words in a trie data structure? How would the time complexity change when counting words with a prefix?"
Practice
Solution
Step 1: Understand the problem statement
The problem asks to find how many words begin with a given prefix string.Step 2: Identify the key operation
We need to check each word and count those that start with the prefix.Final Answer:
Count how many words in a list start with a specific prefix -> Option CQuick Check:
Counting words by prefix = Count how many words in a list start with a specific prefix [OK]
- Confusing prefix with substring anywhere in word
- Counting total words instead of filtered ones
- Ignoring case sensitivity if required
pref?Solution
Step 1: Recall Go standard library functions
strings.HasPrefix(word, pref) returns true if word starts with pref.Step 2: Compare other options
strings.Contains checks anywhere, slicing may panic if prefix longer, equality checks full word.Final Answer:
strings.HasPrefix(word, pref) -> Option AQuick Check:
Use HasPrefix for prefix check [OK]
- Using strings.Contains which checks anywhere in word
- Slicing without length check causing runtime panic
- Comparing whole word instead of prefix
package main
import (
"fmt"
"strings"
)
func countPrefix(words []string, prefix string) int {
count := 0
for _, w := range words {
if strings.HasPrefix(w, prefix) {
count++
}
}
return count
}
func main() {
words := []string{"apple", "app", "application", "banana", "apply"}
fmt.Println(countPrefix(words, "app"))
}Solution
Step 1: Identify words starting with "app"
Words: "apple", "app", "application", "banana", "apply". "banana" does not start with "app".Step 2: Count matching words
Matching words: "apple", "app", "application", "apply" -> 4 words.Final Answer:
4 -> Option AQuick Check:
Count of words starting with "app" = 4 [OK]
- Counting "banana" incorrectly
- Off-by-one error in counting
- Misreading prefix length
func countPrefix(words []string, prefix string) int {
count := 0
for _, w := range words {
if w[:len(prefix)] == prefix {
count++
}
}
return count
}Solution
Step 1: Analyze slicing operation
The code slices w[:len(prefix)] without checking if w is long enough.Step 2: Identify runtime error cause
If w is shorter than prefix, slicing causes index out of range panic.Final Answer:
Index out of range panic if word shorter than prefix -> Option BQuick Check:
Slicing without length check causes panic [OK]
- Ignoring length check before slicing
- Assuming code compiles without imports
- Confusing prefix check with substring check
Solution
Step 1: Understand the problem scale
Counting for many prefixes over many words needs efficiency.Step 2: Compare approaches
Looping over all words for each prefix is slow (O(P*W)). Sorting + binary search helps but trie allows prefix counting efficiently.Step 3: Choose best data structure
Trie stores words by prefix, enabling fast prefix count queries.Final Answer:
Build a trie from words, then query counts for each prefix -> Option DQuick Check:
Trie enables efficient prefix counting [OK]
- Using nested loops causing slow performance
- Using strings.Contains which is incorrect for prefix
- Ignoring data structure benefits
Ready to prove it?
Pass the test and this pattern moves unknown
