Given a list of words, find the longest common prefix of all the words by word by word matching.
Table of Contents
Examples
Input:
list[] = {“apple”, “ape”, “april”}
Output:
ap
Input:
list[] = {“star”, “stole”, “steam”, “start”}
Output:
st
Algorithm for Longest Common Prefix
The longest common prefix of two words is found as,
Let W1 be the first word and W2 be the second word,
- Initialize a string variable commonPrefix as “”(empty string).
- Start traversing in W1 and W2 simultaneously, till we reach the end of any one of the words.
- Match the characters of W1 and W2, if these are equal append it to commonPrefix and advance in both the words.
- Else return commonPrefix
The above algorithm can be extended to find the longest common prefix of list of N words as,
- Initialize a string variable commonPrefix as first word in the list.
- Traverse in the list starting from index 1(o based indexing).
- Update commonPrefix as a common prefix of commonPrefix and current word in the list.
- At the end of the traversal return commonPrefix.
Explanation for Longest Common Prefix
Consider an example,
list[] = {“star”, “stole”, “steam”, “start”}
Step 1
commonPrefix = “star”
Step 2
Repeat step 3 and 4 while traversing the list from index 1 to end of the list.
Step 3 and 4
Iteration 1
commonPrefix= common prefix of (commonPrefix, “stole”)
commonPrefix = “st”
Iteration 2
commonPrefix= common prefix of (commonPrefix, “steam”)
commonPrefix = “st”
Iteration 3
commonPrefix = common prefix of (commonPrefix, “start”)
commonPrefix = “st”
We have traversed the list and the common prefix of all the words in the list is “st”. See the image below for clarification.
JAVA Code
public class LongestCommonPrefixUsingWordByWordMatching { // Function to find common prefix of two words private static String prefix(String W1, String W2) { // Initialize prefix as empty string String prefix = ""; int n1 = W1.length(); int n2 = W2.length(); int i = 0, j = 0; // Traverse in W1 and W2 simultaneously while (i < n1 && j < n2) { // If characters of W1 and W2 are equal, append it to answer else return prefix if (W1.charAt(i) == W2.charAt(j)) { prefix += W1.charAt(i); i++; j++; } else { return prefix; } } // All words matched, return prefix return prefix; } private static String longestCommonPrefix(String[] list) { // Initialize longest common prefix as first word of list String lcp = list[0]; // Traverse the list from index 1 (0 based indexing) for (int i = 1; i < list.length; i++) { // Update lcp as prefix of lcp and current word lcp = prefix(list[i], lcp); } // return lcp return lcp; } public static void main(String[] args) { // Example 1 String list1[] = new String[] {"apple", "ape", "april"}; System.out.println(longestCommonPrefix(list1)); // Example 2 String list2[] = new String[] {"star", "stole", "steam", "start"}; System.out.println(longestCommonPrefix(list2)); } }
C++ Code for Longest Common Prefix
#include <bits/stdc++.h> using namespace std; // Function to find common prefix of two words string prefix(string W1, string W2) { // Initialize prefix as empty string string prefix = ""; int n1 = W1.size(); int n2 = W2.size(); int i = 0, j = 0; // Traverse in W1 and W2 simultaneously while (i < n1 && j < n2) { // If characters of W1 and W2 are equal, append it to answer else return prefix if (W1[i] == W2[j]) { prefix += W1[i]; i++; j++; } else { return prefix; } } // All words matched, return prefix return prefix; } string commonPrefix(vector<std::string> &list) { // Initialize longest common prefix as first word of list string lps = list.front(); // Traverse the list from index 1 (0 based indexing) for (auto itr = list.begin() + 1; itr != list.end(); itr++) { // Update lcp as prefix of lcp and current word lps = prefix(lps, *itr); } // return lcp return lps; } int main() { // Example 1 vector<std::string> list1; list1.push_back("apple"); list1.push_back("ape"); list1.push_back("april"); cout<<commonPrefix(list1)<<endl; // Example 2 vector<std::string> list2; list2.push_back("star"); list2.push_back("stole"); list2.push_back("steam"); list2.push_back("start"); cout<<commonPrefix(list2)<<endl; return 0; }
ap st
Complexity Analysis for Longest Common Prefix
Time Complexity = O(N * maximum length of a word in the list)
Space Complexity = O(1)
where N is the total number of words in the list.