Open In App

Longest Common Substring in an Array of Strings

Last Updated : 15 Sep, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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




// C++ program to find the stem of given list of
// words
#include <bits/stdc++.h>
using namespace std;
 
// function to find the stem (longest common
// substring) from the string array
string findstem(vector<string> arr)
{
    // Determine size of the array
    int n = arr.size();
 
    // Take first word from array as reference
    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++) {
            // generating all possible substrings
            // of our reference string arr[0] i.e s
            string stem = s.substr(i, j);
            int k = 1;
            for (k = 1; k < n; k++) {
                // Check if the generated stem is
                // common to all words
                if (arr[k].find(stem) == std::string::npos)
                    break;
            }
 
            // If current substring is present in
            // all strings and its length is greater
            // than current result
            if (k == n && res.length() < stem.length())
                res = stem;
        }
    }
 
    return res;
}
 
// Driver code
int main()
{
    vector<string> arr{ "grace", "graceful", "disgraceful",
                        "gracefully" };
 
    // Function call
    string stems = findstem(arr);
    cout << stems << endl;
}
 
// This code is contributed by
// sanjeev2552


Java




// Java program to find the stem of given list of
// words
import java.io.*;
import java.util.*;
 
class stem {
 
    // function to find the stem (longest common
    // substring) from the string  array
    public static String findstem(String arr[])
    {
        // Determine size of the array
        int n = arr.length;
 
        // Take first word from array as reference
        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++) {
 
                // generating all possible substrings
                // of our reference string arr[0] i.e s
                String stem = s.substring(i, j);
                int k = 1;
                for (k = 1; k < n; k++)
 
                    // Check if the generated stem is
                    // common to all words
                    if (!arr[k].contains(stem))
                        break;
 
                // If current substring is present in
                // all strings and its length is greater
                // than current result
                if (k == n && res.length() < stem.length())
                    res = stem;
            }
        }
 
        return res;
    }
 
    // Driver Code
    public static void main(String args[])
    {
        String arr[] = { "grace", "graceful",
                        "disgraceful","gracefully" };
       
        // Function call
        String stems = findstem(arr);
        System.out.println(stems);
    }
}


Python 3




# Python 3 program to find the stem
# of given list of words
 
# function to find the stem (longest
# common substring) from the string array
 
 
def findstem(arr):
 
    # Determine size of the array
    n = len(arr)
 
    # Take first word from array
    # as reference
    s = arr[0]
    l = len(s)
 
    res = ""
 
    for i in range(l):
        for j in range(i + 1, l + 1):
 
            # generating all possible substrings
            # of our reference string arr[0] i.e s
            stem = s[i:j]
            k = 1
            for k in range(1, n):
 
                # Check if the generated stem is
                # common to all words
                if stem not in arr[k]:
                    break
 
            # If current substring is present in
            # all strings and its length is greater
            # than current result
            if (k + 1 == n and len(res) < len(stem)):
                res = stem
 
    return res
 
 
# Driver Code
if __name__ == "__main__":
 
    arr = ["grace", "graceful",
           "disgraceful", "gracefully"]
     
    # Function call
    stems = findstem(arr)
    print(stems)
 
# This code is contributed by ita_c


C#




// C# program to find the stem of given list of
// words
using System;
using System.Collections.Generic;
 
class stem
{
    // function to find the stem (longest common
    // substring) from the string array
    public static String findstem(String []arr)
    {
        // Determine size of the array
        int n = arr.Length;
 
        // Take first word from array as reference
        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++)
            {
 
                // generating all possible substrings
                // of our reference string arr[0] i.e s
                String stem = s.Substring(i, j-i);
                int k = 1;
                for (k = 1; k < n; k++)
 
                    // Check if the generated stem is
                    // common to all words
                    if (!arr[k].Contains(stem))
                        break;
                 
                // If current substring is present in
                // all strings and its length is greater
                // than current result
                if (k == n && res.Length < stem.Length)
                    res = stem;
            }
        }
 
        return res;
    }
 
    // Driver Code
    public static void Main(String []args)
    {
        String []arr = { "grace", "graceful", "disgraceful",
                                            "gracefully" };
        // Function call
        String stems = findstem(arr);
        Console.WriteLine(stems);
    }
}
 
// This code contributed by Rajput-Ji


Javascript




// JavaScript program to find the stem of given list of
// words
function findstem(arr) {
 
// Determine size of the array
let n = arr.length;
 
// Take first word from array as reference
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++) {
 
        // generating all possible substrings
        // of our reference string arr[0] i.e s
        let stem = s.substring(i, j);
        let k = 1;
        for (k = 1; k < n; k++) {
 
            // Check if the generated stem is
            // common to all words
            if (!arr[k].includes(stem))
                break;
        }
 
        // If current substring is present in
        // all strings and its length is greater
        // than current result
        if (k === n && res.length < stem.length)
            res = stem;
    }
}
 
return res;
}
 
// Driver Code
let arr = ["grace", "graceful", "disgraceful", "gracefully"];
 
// Function call
let stems = findstem(arr);
console.log(stems);


PHP




<?php
// PHP program to find the stem of given list of
// words
 
    // function to find the stem (longest common
    // substring) from the string array
    function findstem($arr)
    {
        // Determine size of the array
        $n = count($arr);
 
        // Take first word from array as reference
        $s = $arr[0];
        $len = strlen($s);
         
        $res = "";
 
        for ($i = 0; $i < $len; $i++)
        {
            for ($j = $i+1; $j <=$len; $j++)
            {
 
                // generating all possible substrings
                // of our reference string arr[0] i.e s
                $stem = substr($s,$i, $j-$i);
                 
                $k = 1;
                for ($k = 1; $k < $n; $k++)
 
                    // Check if the generated stem is
                    // common to all words
                    if (!strpos($arr[$k],$stem))
                        break;
                 
                // If current substring is present in
                // all strings and its length is greater
                // than current result
                if ($k <= $n && strlen($res) < strlen($stem))
                    $res = $stem;
                 
            }
        }
 
        return $res;
    }
 
    // Driver Code
    $arr = array( "grace", "graceful",
                 "disgraceful", "gracefully" );
 
    // Function call
    $stems = findstem($arr);
    print($stems);
     
// This code is contributed by mits
?>


Output

grace



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads