Given an array of strings arr. Return the longest common prefix among all strings present in the array. If there’s no prefix common in all the strings, return “-1“.
Examples :
Input: arr[] = ["geeksforgeeks", "geeks", "geek", "geezer"] Output: gee Explanation: "gee" is the longest common prefix in all the given strings.
Input: arr[] = ["hello", "world"] Output: -1 Explanation: There's no common prefix in the given strings.
Expected Time Complexity: O(n*min(|arri|))
Expected Space Complexity: O(min(|arri|))
Constraints:
1 ≤ |arr| ≤ 103
1 ≤ |arr[i]| ≤ 103
Approach 01:
-
C++
-
Python
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
string longestCommonPrefix(vector<string>& strings) {
int numStrings = strings.size();
// Sort the vector of strings
sort(strings.begin(), strings.end());
// Take the first string as the reference for finding the common prefix
int referenceLength = strings[0].length();
string referenceString = strings[0];
string commonPrefix = "";
// Iterate through the characters of the reference string
for (int i = 1; i <= referenceLength; ++i) {
string currentPrefix = referenceString.substr(0, i);
bool isCommonPrefix = true;
// Check if the current prefix is common to all strings
for (int j = 1; j < numStrings; ++j) {
if (strings[j].substr(0, i) != currentPrefix) {
isCommonPrefix = false;
break;
}
}
// If the current prefix is common to all strings, update the result
if (isCommonPrefix) {
commonPrefix = currentPrefix;
}
}
// If no common prefix is found, return "-1"
if (commonPrefix.length() == 0) {
return "-1";
}
return commonPrefix;
}
};
from typing import List
class Solution:
def longestCommonPrefix(self, strings: List[str]) -> str:
numStrings = len(strings)
# Sort the list of strings
strings.sort()
# Take the first string as the reference for finding the common prefix
referenceLength = len(strings[0])
referenceString = strings[0]
commonPrefix = ""
# Iterate through the characters of the reference string
for i in range(1, referenceLength + 1):
currentPrefix = referenceString[:i]
isCommonPrefix = True
# Check if the current prefix is common to all strings
for j in range(1, numStrings):
if strings[j][:i] != currentPrefix:
isCommonPrefix = False
break
# If the current prefix is common to all strings, update the result
if isCommonPrefix:
commonPrefix = currentPrefix
# If no common prefix is found, return "-1"
if len(commonPrefix) == 0:
return "-1"
return commonPrefix
Time Complexity
- Sorting the Vector of Strings:
Sorting the vector of strings takes \( O(n \log n) \) time, where \( n \) is the number of strings in the input vector.
- Finding the Longest Common Prefix:
Finding the longest common prefix involves iterating through the characters of the shortest string and comparing each character with the corresponding character in all other strings. In the worst case, this takes \( O(n \cdot m) \) time, where \( m \) is the length of the shortest string and \( n \) is the number of strings.
- Overall Time Complexity:
The overall time complexity is \( O(n \log n + n \cdot m) \), where \( n \) is the number of strings and \( m \) is the length of the shortest string.
Space Complexity
- Space for Sorting:
The sorting operation does not require any additional space other than the input vector itself, so it uses \( O(1) \) additional space.
- Space for Storing the Common Prefix:
The space required for storing the common prefix is \( O(m) \), where \( m \) is the length of the shortest string.
- Overall Space Complexity:
The overall space complexity is \( O(m) \), where \( m \) is the length of the shortest string.