Longest Common Prefix in DSA C++ - Time & Space Complexity
We want to know how the time needed to find the longest common prefix grows as we add more words or longer words.
How does the work change when the list of words or their length increases?
Analyze the time complexity of the following code snippet.
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return "";
string prefix = strs[0];
for (int i = 1; i < strs.size(); i++) {
while (strs[i].find(prefix) != 0) {
prefix = prefix.substr(0, prefix.size() - 1);
if (prefix.empty()) return "";
}
}
return prefix;
}
This code finds the longest common prefix string among an array of strings by comparing prefixes and shortening them until all strings match.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The outer loop goes through each string, and the inner while loop shortens the prefix until it matches the start of the current string.
- How many times: The outer loop runs once per string (n times), and the inner loop can run up to the length of the prefix (m times) in the worst case.
As the number of strings (n) or the length of the prefix (m) grows, the work increases roughly by multiplying these two.
| Input Size (n) | Approx. Operations (m=5) |
|---|---|
| 10 | About 50 checks |
| 100 | About 500 checks |
| 1000 | About 5000 checks |
Pattern observation: Doubling the number of strings roughly doubles the work, and longer prefixes increase the work linearly.
Time Complexity: O(n * m)
This means the time grows proportionally to the number of strings times the length of the prefix.
[X] Wrong: "The time depends only on the number of strings, not their length."
[OK] Correct: The prefix length matters because we compare characters one by one, so longer prefixes mean more checks per string.
Understanding this helps you explain how your solution scales with input size, a key skill interviewers look for.
"What if we sorted the strings first and only compared the first and last strings? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem definition
The Longest Common Prefix means the longest substring at the start of all strings that is the same.Step 2: Compare options with the definition
Only The longest starting substring common to all strings matches the definition exactly: longest starting substring common to all strings.Final Answer:
The longest starting substring common to all strings -> Option BQuick Check:
Longest Common Prefix = longest starting substring [OK]
- Confusing prefix with substring anywhere
- Thinking about suffix instead of prefix
- Counting characters instead of substring
strs with values "flower", "flow", "flight"?Solution
Step 1: Check correct vector initialization syntax
In C++, to initialize a vector of strings with values, use curly braces {} and specify type with std::vector.Step 2: Validate each option
std::vector strs = {"flower", "flow", "flight"}; uses correct syntax with std::vector and braces {}. Versions missing std:: namespace, using parentheses instead of braces, or lacking template type <std::string> are invalid.Final Answer:
std::vector strs = {"flower", "flow", "flight"}; -> Option AQuick Check:
Correct vector initialization uses braces and type [OK]
- Using parentheses instead of braces
- Omitting std:: namespace
- Missing template argument
std::vector strs = {"interview", "internet", "internal"};
std::string prefix = strs[0];
for (int i = 1; i < strs.size(); i++) {
int j = 0;
while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {
j++;
}
prefix = prefix.substr(0, j);
}
std::cout << prefix << std::endl;Solution
Step 1: Initialize prefix and compare with each string
Start prefix = "interview". Compare with "internet": common prefix is "inter". Update prefix = "inter".Step 2: Compare updated prefix "inter" with "internal"
Common prefix is "inter" again. So prefix remains "inter".Final Answer:
inter -> Option DQuick Check:
Common prefix of all = "inter" [OK]
- Stopping after first comparison
- Not updating prefix correctly
- Confusing substring indices
std::string longestCommonPrefix(std::vector& strs) {
std::string prefix = strs[0];
for (int i = 1; i < strs.size(); i++) {
int j = 0;
while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {
j++;
}
prefix = prefix.substr(0, j);
if (prefix.empty()) return "";
}
return prefix;
}
// Usage:
// std::vector words = {"dog", "racecar", "car"};
// std::cout << longestCommonPrefix(words) << std::endl;Solution
Step 1: Check empty input handling
The code directly accesses strs[0] without checking if strs is empty, causing a runtime error (out-of-range access) for empty vectors.Step 2: Verify other statements
The loop logic correctly shortens the prefix, no infinite loop occurs, it returns prefix not suffix, and for {"dog", "racecar", "car"} it correctly returns "".Final Answer:
The function does not handle empty input vector -> Option AQuick Check:
Missing if(strs.empty()) return ""; [OK]
- Overlooking empty vector handling
- Misjudging the output for no common prefix cases
- Suspecting infinite loop in the while condition
{"apple", "ape", "april", "apt"}, write a C++ function to find the longest common prefix using a vertical scanning approach. What will be the output of your function?Solution
Step 1: Understand vertical scanning approach
Check characters column by column across all strings until mismatch or end of any string.Step 2: Apply vertical scanning on given strings
Index 0: all have 'a'. Index 1: all have 'p'. Index 2: "apple" has 'p', "ape" has 'e' (mismatch). Stop scanning.Final Answer:
"ap" -> Option CQuick Check:
Vertical scan stops at first mismatch, prefix = "ap" [OK]
- Assuming prefix is longest word's start
- Stopping scan too early or too late
- Confusing vertical with horizontal scanning
Ready to prove it?
Pass the test and this pattern moves unknown
