Given a set of strings of the same length, we need to find the length of the longest string, which is a prefix string of at least two strings.
Examples:
Input: ["abcde", "abcsd", "bcsdf", "abcda", "abced"] Output: 4 Explanation: Longest prefix string is "abcd". Input: ["pqrstq", "pwxyza", "abcdef", "pqrstu"] Output: 5
Approach:
- Starting from the 0th position, iterate over every character and check if that character occurs in at least two of the strings at the current position or not.
- If it occurs, then recursively call on the next position. Otherwise,
- Update the max value by taking the current maximum with Current_position – 1.
- Finally, return the max value.
C++
// C++ program to find longest // string which is prefix string // of at least two strings #include<bits/stdc++.h> using namespace std; int max1=0; // Function to find Max length // of the prefix int MaxLength(vector<string> v, int i, int m) { // Base case if (i>=m) { return m-1; } // Iterating over all the alphabets for ( int k = 0; k < 26; k++) { char c = 'a' + k; vector<string> v1; // Checking if char exists in // current string or not for ( int j = 0; j < v.size(); j++) { if (v[j][i] == c) { v1.push_back(v[j]); } } // If atleast 2 string have // that character if (v1.size()>=2) { // Recursive call to i+1 max1=max(max1, MaxLength(v1, i+1, m)); } else { max1=max(max1, i - 1); } } return max1; } // Driver code int main() { // Initialising strings string s1, s2, s3, s4, s5; s1 = "abcde" ; s2 = "abcsd" ; s3 = "bcsdf" ; s4 = "abcda" ; s5 = "abced" ; vector<string> v; // push strings into vectors. v.push_back(s1); v.push_back(s2); v.push_back(s3); v.push_back(s4); v.push_back(s5); int m = v[0].size(); cout<<MaxLength(v, 0, m) + 1<<endl; return 0; } |
Java
// Java program to find longest // String which is prefix String // of at least two Strings import java.util.*; class GFG{ static int max1 = 0 ; // Function to find Max length // of the prefix static int MaxLength(Vector<String> v, int i, int m) { // Base case if (i>=m) { return m- 1 ; } // Iterating over all the alphabets for ( int k = 0 ; k < 26 ; k++) { char c = ( char )( 'a' + k); Vector<String> v1 = new Vector<String>(); // Checking if char exists in // current String or not for ( int j = 0 ; j < v.size(); j++) { if (v.get(j).charAt(i) == c) { v1.add(v.get(j)); } } // If atleast 2 String have // that character if (v1.size() >= 2 ) { // Recursive call to i+1 max1=Math.max(max1, MaxLength(v1, i + 1 , m)); } else { max1=Math.max(max1, i - 1 ); } } return max1; } // Driver code public static void main(String[] args) { // Initialising Strings String s1, s2, s3, s4, s5; s1 = "abcde" ; s2 = "abcsd" ; s3 = "bcsdf" ; s4 = "abcda" ; s5 = "abced" ; Vector<String> v = new Vector<String>(); // push Strings into vectors. v.add(s1); v.add(s2); v.add(s3); v.add(s4); v.add(s5); int m = v.get( 0 ).length(); System.out.print(MaxLength(v, 0 , m) + 1 ); } } // This code is contributed by shikhasingrajput |
Python3
# Python3 program to find longest # string which is prefix string # of at least two strings max1 = 0 # Function to find max length # of the prefix def MaxLength(v, i, m): global max1 # Base case if (i > = m): return m - 1 # Iterating over all the alphabets for k in range ( 26 ): c = chr ( ord ( 'a' ) + k) v1 = [] # Checking if char exists in # current string or not for j in range ( len (v)): if (v[j][i] = = c): v1.append(v[j]) # If atleast 2 string have # that character if ( len (v1) > = 2 ): # Recursive call to i+1 max1 = max (max1, MaxLength(v1, i + 1 , m)) else : max1 = max (max1, i - 1 ) return max1 # Driver code if __name__ = = '__main__' : # Initialising strings s1 = "abcde" s2 = "abcsd" s3 = "bcsdf" s4 = "abcda" s5 = "abced" v = [] # Push strings into vectors. v.append(s1) v.append(s2) v.append(s3) v.append(s4) v.append(s5) m = len (v[ 0 ]) print (MaxLength(v, 0 , m) + 1 ) # This code is contributed by BhupendraSingh |
C#
// C# program to find longest // String which is prefix String // of at least two Strings using System; using System.Collections.Generic; class GFG{ static int max1 = 0; // Function to find Max length // of the prefix static int MaxLength(List<String> v, int i, int m) { // Base case if (i >= m) { return m - 1; } // Iterating over all the alphabets for ( int k = 0; k < 26; k++) { char c = ( char )( 'a' + k); List<String> v1 = new List<String>(); // Checking if char exists in // current String or not for ( int j = 0; j < v.Count; j++) { if (v[j][i] == c) { v1.Add(v[j]); } } // If atleast 2 String have // that character if (v1.Count >= 2) { // Recursive call to i+1 max1 = Math.Max(max1, MaxLength(v1, i + 1, m)); } else { max1 = Math.Max(max1, i - 1); } } return max1; } // Driver code public static void Main(String[] args) { // Initialising Strings String s1, s2, s3, s4, s5; s1 = "abcde" ; s2 = "abcsd" ; s3 = "bcsdf" ; s4 = "abcda" ; s5 = "abced" ; List<String> v = new List<String>(); // push Strings into vectors. v.Add(s1); v.Add(s2); v.Add(s3); v.Add(s4); v.Add(s5); int m = v[0].Length; Console.Write(MaxLength(v, 0, m) + 1); } } // This code is contributed by Amit Katiyar |
Javascript
<script> // Javascript program to find longest // string which is prefix string // of at least two strings let max1=0; // Function to find Max length // of the prefix function MaxLength(v, i, m) { // Base case if (i>=m) { return m-1; } // Iterating over all the alphabets for (let k = 0; k < 26; k++) { let c = String.fromCharCode( 'a' .charCodeAt(0) + k); let v1 = []; // Checking if char exists in // current string or not for (let j = 0; j < v.length; j++) { if (v[j][i] == c) { v1.push(v[j]); } } // If atleast 2 string have // that character if (v1.length >= 2) { // Recursive call to i+1 max1 = Math.max(max1, MaxLength(v1, i+1, m)); } else { max1 = Math.max(max1, i - 1); } } return max1; } // Driver code // Initialising strings let s1, s2, s3, s4, s5; s1 = "abcde" ; s2 = "abcsd" ; s3 = "bcsdf" ; s4 = "abcda" ; s5 = "abced" ; let v = []; // push strings into vectors. v.push(s1); v.push(s2); v.push(s3); v.push(s4); v.push(s5); let m = v[0].length; document.write(MaxLength(v, 0, m) + 1 + "<br>" ); </script> |
4
Time Complexity: O(N*26)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!