Open In App

Longest string which is prefix string of at least two strings

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:




// 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 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 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# 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




<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>

Output: 

4

Time Complexity: O(N*26)
Auxiliary Space: O(1)
 


Article Tags :