# Smallest String consisting of a String S exactly K times as a Substring

• Difficulty Level : Medium
• Last Updated : 01 Nov, 2022

Given a string S of length N and integer K, find the smallest length string which contains the string S as a sub string exactly K times.

Examples:

Input: S = “abba”, K = 3
Output: abbabbabba
Explanation: The string “abba” occurs K times in the string abbabbabba, i.e. {abbabbabba, abbabbabba, abbabbabba

Input: S = “geeksforgeeks”, K = 3
Output: “geeksforgeeksforgeeksforgeeks”

Approach: To optimize the above approach, find the Longest Proper Prefix which is also a suffix for the given string S, and then generate a substring of S excluding the longest common prefix and add this substring to the answer exactly K – 1 times to the original string. Follow the below steps to solve the problem:

• Find the length of the longest proper prefix using KMP algorithm.
• Append substring S.substring(N-lps[N-1]) to S, exactly K-1 times.

## C++

 `// C++ Program to implement``// the above approach``#include ``using` `namespace` `std;` `// KMP algorithm``int``* kmp(string& s)``{` `    ``int` `n = s.size();``    ``int``* lps = ``new` `int``[n];` `    ``lps[0] = 0;``    ``int` `i = 1, len = 0;``    ``while` `(i < n) {` `        ``if` `(s[i] == s[len]) {``            ``len++;``            ``lps[i] = len;``            ``i++;``        ``}``        ``else` `{``            ``if` `(len != 0) {``                ``len = lps[len - 1];``            ``}``            ``else` `{``                ``lps[i] = 0;``                ``i++;``            ``}``        ``}``    ``}` `    ``return` `lps;``}` `// Function to return the required string``string findString(string& s, ``int` `k)``{` `    ``int` `n = s.length();` `    ``// Finding the longest proper prefix``    ``// which is also suffix``    ``int``* lps = kmp(s);` `    ``// ans string``    ``string ans = ``""``;` `    ``string suff``        ``= s.substr(0, n - lps[n - 1]);` `    ``for` `(``int` `i = 0; i < k - 1; ++i) {` `        ``// Update ans appending the``        ``// substring K - 1 times``        ``ans += suff;``    ``}` `    ``// Append the original string``    ``ans += s;` `    ``// Returning min length string``    ``// which contain exactly k``    ``// substring of given string``    ``return` `ans;``}` `// Driver Code``int` `main()``{` `    ``int` `k = 3;` `    ``string s = ``"geeksforgeeks"``;` `    ``cout << findString(s, k) << endl;``}`

## Java

 `// Java program to implement``// the above approach``import` `java.util.*;` `class` `GFG{``    ` `// KMP algorithm``static` `int``[] kmp(String s)``{``    ``int` `n = s.length();``    ``int``[] lps = ``new` `int``[n];``    ``lps[``0``] = ``0``;` `    ``int` `i = ``1``, len = ``0``;``    ` `    ``while` `(i < n)``    ``{``        ``if` `(s.charAt(i) == s.charAt(len))``        ``{``            ``len++;``            ``lps[i] = len;``            ``i++;``        ``}``        ``else``        ``{``            ``if` `(len != ``0``)``            ``{``                ``len = lps[len - ``1``];``            ``}``            ``else``            ``{``                ``lps[i] = ``0``;``                ``i++;``            ``}``        ``}``    ``}``    ``return` `lps;``}` `// Function to return the required string``static` `String findString(String s, ``int` `k)``{``    ``int` `n = s.length();` `    ``// Finding the longest proper prefix``    ``// which is also suffix``    ``int``[] lps = kmp(s);` `    ``// ans string``    ``String ans = ``""``;` `    ``String suff = s.substring(``0``, n - lps[n - ``1``]);` `    ``for``(``int` `i = ``0``; i < k - ``1``; ++i)``    ``{``        ` `        ``// Update ans appending the``        ``// substring K - 1 times``        ``ans += suff;``    ``}` `    ``// Append the original string``    ``ans += s;` `    ``// Returning min length string``    ``// which contain exactly k``    ``// substring of given string``    ``return` `ans;``}` `// Driver code``public` `static` `void` `main (String[] args)``{``    ``int` `k = ``3``;``    ` `    ``String s = ``"geeksforgeeks"``;``    ` `    ``System.out.println(findString(s, k));``}``}` `// This code is contributed by offbeat`

## Python3

 `# Python3 program to implement``# the above approach` `# KMP algorithm``def` `kmp(s):``    ` `    ``n ``=` `len``(s)``    ``lps ``=` `[``None``] ``*` `n``    ``lps[``0``] ``=` `0` `    ``i, ``Len` `=` `1``, ``0``    ` `    ``while` `(i < n):``    ` `        ``if` `(s[i] ``=``=` `s[``Len``]):``            ``Len` `+``=` `1``            ``lps[i] ``=` `Len``            ``i ``+``=` `1``            ` `        ``else``:``            ``if` `(``Len` `!``=` `0``):``                ``Len` `=` `lps[``Len` `-` `1``]``            ``else``:``                ``lps[i] ``=` `0``                ``i ``+``=` `1``                ` `    ``return` `lps``    ` `# Function to return the required string``def` `findString(s, k):` `    ``n ``=` `len``(s)` `    ``# Finding the longest proper prefix``    ``# which is also suffix``    ``lps ``=` `kmp(s)` `    ``# ans string``    ``ans ``=` `""``    ` `    ``suff ``=` `s[``0``: n ``-` `lps[n ``-` `1``] : ``1``]` `    ``for` `i ``in` `range``(k ``-` `1``):``        ` `        ``# Update ans appending the``        ``# substring K - 1 times``        ``ans ``+``=` `suff` `    ``# Append the original string``    ``ans ``+``=` `s` `    ``# Returning min length string``    ``# which contain exactly k``    ``# substring of given string``    ``return` `ans` `# Driver code``k ``=` `3``    ` `s ``=` `"geeksforgeeks"``    ` `print``(findString(s, k))` `# This code is contributed by divyeshrabadiya07`

## C#

 `// C# program to implement``// the above approach``using` `System;` `class` `GFG{``    ` `// KMP algorithm``static` `int``[] kmp(``string` `s)``{``    ``int` `n = s.Length;``    ``int``[] lps = ``new` `int``[n];``    ``lps[0] = 0;` `    ``int` `i = 1, len = 0;``    ` `    ``while` `(i < n)``    ``{``        ``if` `(s[i] == s[len])``        ``{``            ``len++;``            ``lps[i] = len;``            ``i++;``        ``}``        ``else``        ``{``            ``if` `(len != 0)``            ``{``                ``len = lps[len - 1];``            ``}``            ``else``            ``{``                ``lps[i] = 0;``                ``i++;``            ``}``        ``}``    ``}``    ``return` `lps;``}` `// Function to return the required string``static` `string` `findString(``string` `s, ``int` `k)``{``    ``int` `n = s.Length;` `    ``// Finding the longest proper prefix``    ``// which is also suffix``    ``int``[] lps = kmp(s);` `    ``// ans string``    ``string` `ans = ``""``;` `    ``string` `suff = s.Substring(0,``                            ``n - lps[n - 1]);` `    ``for``(``int` `i = 0; i < k - 1; ++i)``    ``{``        ` `        ``// Update ans appending the``        ``// substring K - 1 times``        ``ans += suff;``    ``}` `    ``// Append the original string``    ``ans += s;` `    ``// Returning min length string``    ``// which contain exactly k``    ``// substring of given string``    ``return` `ans;``}` `// Driver code``public` `static` `void` `Main (``string``[] args)``{``    ``int` `k = 3;``    ` `    ``string` `s = ``"geeksforgeeks"``;``    ` `    ``Console.Write(findString(s, k));``}``}` `// This code is contributed by rutvik_56`

## Javascript

 ``

Output

`geeksforgeeksforgeeksforgeeks`

Time Complexity: O( |S| ), where S is the given string
Auxiliary Space: O( |S| )

My Personal Notes arrow_drop_up