Longest Common Substring in an Array of Strings
Last Updated :
15 Sep, 2023
We are given a list of words sharing a common stem i.e the words originate from same word for ex: the words sadness, sadly and sad all originate from the stem ‘sad’.
Our task is to find and return the Longest Common Substring also known as stem of those words. In case there are ties, we choose the smallest one in alphabetical order.
Examples:
Input : grace graceful disgraceful gracefully
Output : grace
Input : sadness sad sadly
Output : sad
The idea is to take any word from the list as reference and form all its substrings and iterate over the entire list checking if the generated substring occurs in all of them.
Below is the implementation of the above idea:
C++
#include <bits/stdc++.h>
using namespace std;
string findstem(vector<string> arr)
{
int n = arr.size();
string s = arr[0];
int len = s.length();
string res = "" ;
for ( int i = 0; i < len; i++) {
for ( int j = i + 1; j <= len; j++) {
string stem = s.substr(i, j);
int k = 1;
for (k = 1; k < n; k++) {
if (arr[k].find(stem) == std::string::npos)
break ;
}
if (k == n && res.length() < stem.length())
res = stem;
}
}
return res;
}
int main()
{
vector<string> arr{ "grace" , "graceful" , "disgraceful" ,
"gracefully" };
string stems = findstem(arr);
cout << stems << endl;
}
|
Java
import java.io.*;
import java.util.*;
class stem {
public static String findstem(String arr[])
{
int n = arr.length;
String s = arr[ 0 ];
int len = s.length();
String res = "" ;
for ( int i = 0 ; i < len; i++) {
for ( int j = i + 1 ; j <= len; j++) {
String stem = s.substring(i, j);
int k = 1 ;
for (k = 1 ; k < n; k++)
if (!arr[k].contains(stem))
break ;
if (k == n && res.length() < stem.length())
res = stem;
}
}
return res;
}
public static void main(String args[])
{
String arr[] = { "grace" , "graceful" ,
"disgraceful" , "gracefully" };
String stems = findstem(arr);
System.out.println(stems);
}
}
|
Python 3
def findstem(arr):
n = len (arr)
s = arr[ 0 ]
l = len (s)
res = ""
for i in range (l):
for j in range (i + 1 , l + 1 ):
stem = s[i:j]
k = 1
for k in range ( 1 , n):
if stem not in arr[k]:
break
if (k + 1 = = n and len (res) < len (stem)):
res = stem
return res
if __name__ = = "__main__" :
arr = [ "grace" , "graceful" ,
"disgraceful" , "gracefully" ]
stems = findstem(arr)
print (stems)
|
C#
using System;
using System.Collections.Generic;
class stem
{
public static String findstem(String []arr)
{
int n = arr.Length;
String s = arr[0];
int len = s.Length;
String res = "" ;
for ( int i = 0; i < len; i++)
{
for ( int j = i + 1; j <= len; j++)
{
String stem = s.Substring(i, j-i);
int k = 1;
for (k = 1; k < n; k++)
if (!arr[k].Contains(stem))
break ;
if (k == n && res.Length < stem.Length)
res = stem;
}
}
return res;
}
public static void Main(String []args)
{
String []arr = { "grace" , "graceful" , "disgraceful" ,
"gracefully" };
String stems = findstem(arr);
Console.WriteLine(stems);
}
}
|
Javascript
function findstem(arr) {
let n = arr.length;
let s = arr[0];
let len = s.length;
let res = "" ;
for (let i = 0; i < len; i++) {
for (let j = i + 1; j <= len; j++) {
let stem = s.substring(i, j);
let k = 1;
for (k = 1; k < n; k++) {
if (!arr[k].includes(stem))
break ;
}
if (k === n && res.length < stem.length)
res = stem;
}
}
return res;
}
let arr = [ "grace" , "graceful" , "disgraceful" , "gracefully" ];
let stems = findstem(arr);
console.log(stems);
|
PHP
<?php
function findstem( $arr )
{
$n = count ( $arr );
$s = $arr [0];
$len = strlen ( $s );
$res = "" ;
for ( $i = 0; $i < $len ; $i ++)
{
for ( $j = $i +1; $j <= $len ; $j ++)
{
$stem = substr ( $s , $i , $j - $i );
$k = 1;
for ( $k = 1; $k < $n ; $k ++)
if (! strpos ( $arr [ $k ], $stem ))
break ;
if ( $k <= $n && strlen ( $res ) < strlen ( $stem ))
$res = $stem ;
}
}
return $res ;
}
$arr = array ( "grace" , "graceful" ,
"disgraceful" , "gracefully" );
$stems = findstem( $arr );
print ( $stems );
?>
|
Share your thoughts in the comments
Please Login to comment...