Given array of strings, write a function that will print the smallest string that contains each string in the array as substring
Example
INPUT
arr[] = {“catlog”, “dog”, “loggk”, “xcatdo” }
OUTPUT
“catloggkxcatdog”
In the output string, all the strings in the given array are substrings
Algorithm
1. Create a auxiliary array temp[], and copy all the strings of arr[] into temp[]
2. Till Temp[] contains more than two strings
a. Find the most overlapping string pair in temp[]. Let this pair be ‘s1’ and ‘s2’.
b. Replace ‘s1’ and ‘s2’ with the string obtained after combining them
3. At the end, temp[] contains the resultant string
Implementation of algorithm for above example :
arr[] = {“catlog”, “dog”, “loggk”, “xcatdo” }
temp[] = {“catlog”, “dog”, “loggk”, “xcatdo” }
First most overlappig pair is “catlog” and “loggk”
Merge Them, “catloggk”
Now, temp[] = {“catloggk”, “dog”, “xcatdo”}
Most overlapping pair is “dog” and “xcatdo”
Merger Them, “xcatdog”
Now, temp[] = {“catloggk”, “dogxcatdo” }
No overlapping so just merge them
res = “catloggkxcatdog”
#include <bits/stdc++.h>
using namespace std;
// Utility function to calculate minimum of two numbers
int min(int a, int b)
{
return (a < b) ? a : b;
}
// Function to calculate maximum overlap in two given strings
int findOverlappingPair(string s1, string s2, string &s)
{
// max will store maximum length of the matching prefix and suffix
int max = INT_MIN;
int len1 = s1.length();
int len2 = s2.length();
// check suffix of s1 matches with prefix of s2
for (int i = 1; i <= min(len1, len2); i++)
{
// compare last i characters in s1 with first i
// characters in s2
if (s1.compare(len1-i, i, s2, 0, i) == 0)
{
if (max < i)
{
//update max and s
max = i;
s = s1 + s2.substr(i);
}
}
}
// check prefix of s1 matches with suffix of s2
for (int i = 1; i <= min(len1, len2); i++)
{
// compare first i characters in s1 with last i
// characters in s2
if (s1.compare(0, i, s2, len2-i, i) == 0)
{
if (max < i)
{
//update max and s
max = i;
s = s2 + s1.substr(i);
}
}
}
return max;
}
// Function to find shortest superstring
string findShortestSuperstring(string arr[], int n)
{
// run n-1 times to consider every pair
while(n != 1)
{
int max = INT_MIN; // to store maximum overlap
int l, r; // to store array index of overlaping strings
string res; // to store resultant string after overlap
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
string s;
// max_len will store maximum length of the matching
int max_len = findOverlappingPair(arr[i], arr[j], s);
// prefix and suffix s is passed by reference.
if (max < max_len)
{
// will store the resultant string after maximum
// overlap of arr[i] and arr[j],
max = max_len;
res.assign(s);
l = i, r = j;
}
}
}
n--; //ignore last element in next cycle
// if no overlap, append arr[n] to arr[0]
if (max == INT_MIN)
arr[0] += arr[n];
else
{
arr[l] = res; // copy resultant string to index l
arr[r] = arr[n]; // copy string at last index to index r
}
}
return arr[0];
}
// Driver program
int main()
{
string arr[] = {"catlog", "dog", "loggk", "xcatdo" };
int n = sizeof(arr)/sizeof(arr[0]);
cout << "The Shortest Superstring is "
<< findShortestSuperstring(arr, n)<<endl;
return 0;
}