# Minimum number of times A has to be repeated such that B is a substring of it

Given two strings A and B. The task is to find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution exsits print -1.

Examples:

Input : A = “abcd”, B = “cdabcdab”
Output : 3
Repeating A three times (“abcdabcdabcd”), B is a substring of it. B is not a substring of A when it is repeated less than 3 times

Input : A = “ab”, B = “cab”
Output : -1

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach :
Imagine we wrote S = A+A+A+… If B is a substring of S, we only need to check whether some index 0 or 1 or …. length(A) -1 starts with B, as S is long enough to contain B, and S has a period of length(A).

Now, suppose ans is the least number for which length(B) <= length(A * ans). We only need to check whether B is a substring of A * ans or A * (ans+1). If we try k < ans, then B has larger length than A * ans and therefore can’t be a substring. When k = ans+1, A * k is already big enough to try all positions for B( A[i:i+length(B)] == B for i = 0, 1, …, length(A) – 1).

Below is the implementation of the above approach :

## C++

 `// CPP program to find Minimum number of times A  ` `// has to be repeated such that B is a substring of it ` `#include ` `using` `namespace` `std; ` ` `  `// Function to check if a number  ` `// is a substring of other or not ` `bool` `issubstring(string str2, string rep1) ` `{ ` `    ``int` `M = str2.length(); ` `    ``int` `N = rep1.length(); ` ` `  `    ``// Check for substring from starting  ` `    ``// from i'th index of main string ` `    ``for` `(``int` `i = 0; i <= N - M; i++) { ` `        ``int` `j; ` ` `  `        ``// For current index i,  ` `        ``// check for pattern match ` `        ``for` `(j = 0; j < M; j++) ` `            ``if` `(rep1[i + j] != str2[j]) ` `                ``break``; ` ` `  `        ``if` `(j == M) ``// pattern matched ` `            ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ``// not a substring ` `} ` ` `  `// Function to find Minimum number of times A  ` `// has to be repeated such that B is a substring of it ` `int` `Min_repetation(string A, string B) ` `{ ` `    ``// To store minimum number of repetations ` `    ``int` `ans = 1; ` `     `  `    ``// To store repeated string ` `    ``string S = A; ` `     `  `    ``// Untill size of S is less than B ` `    ``while``(S.size() < B.size()) ` `    ``{ ` `        ``S += A; ` `        ``ans++; ` `    ``} ` `     `  `    ``// ans times repetation makes required answer ` `    ``if` `(issubstring(B, S)) ``return` `ans; ` `     `  `    ``// Add one more string of A    ` `    ``if` `(issubstring(B, S+A))  ` `        ``return` `ans + 1; ` `         `  `    ``// If no such solution exits     ` `    ``return` `-1; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``string A = ``"abcd"``, B = ``"cdabcdab"``; ` `     `  `    ``// Function call ` `    ``cout << Min_repetation(A, B); ` `     `  `    ``return` `0; ` `} `

## Java

 `// Java program to find minimum number  ` `// of times 'A' has to be repeated  ` `// such that 'B' is a substring of it ` `class` `GFG  ` `{ ` ` `  `// Function to check if a number  ` `// is a substring of other or not ` `static` `boolean` `issubstring(String str2,  ` `                           ``String rep1) ` `{ ` `    ``int` `M = str2.length(); ` `    ``int` `N = rep1.length(); ` ` `  `    ``// Check for substring from starting  ` `    ``// from i'th index of main string ` `    ``for` `(``int` `i = ``0``; i <= N - M; i++)  ` `    ``{ ` `        ``int` `j; ` ` `  `        ``// For current index i,  ` `        ``// check for pattern match ` `        ``for` `(j = ``0``; j < M; j++) ` `            ``if` `(rep1.charAt(i + j) != str2.charAt(j)) ` `                ``break``; ` ` `  `        ``if` `(j == M) ``// pattern matched ` `            ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ``// not a substring ` `} ` ` `  `// Function to find Minimum number  ` `// of times 'A' has to be repeated  ` `// such that 'B' is a substring of it ` `static` `int` `Min_repetation(String A, String B) ` `{ ` `    ``// To store minimum number of repetations ` `    ``int` `ans = ``1``; ` `     `  `    ``// To store repeated string ` `    ``String S = A; ` `     `  `    ``// Untill size of S is less than B ` `    ``while``(S.length() < B.length()) ` `    ``{ ` `        ``S += A; ` `        ``ans++; ` `    ``} ` `     `  `    ``// ans times repetation makes required answer ` `    ``if` `(issubstring(B, S)) ``return` `ans; ` `     `  `    ``// Add one more string of A  ` `    ``if` `(issubstring(B, S + A))  ` `        ``return` `ans + ``1``; ` `         `  `    ``// If no such solution exits  ` `    ``return` `-``1``; ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args)  ` `{ ` `    ``String A = ``"abcd"``, B = ``"cdabcdab"``; ` `     `  `    ``// Function call ` `    ``System.out.println(Min_repetation(A, B)); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

## Python3

 `# Python3 program to find minimum number ` `# of times 'A' has to be repeated ` `# such that 'B' is a substring of it ` ` `  `# Methof to find Minimum number  ` `# of times 'A' has to be repeated  ` `# such that 'B' is a substring of it ` `def` `min_repetitions(a, b): ` `    ``len_a ``=` `len``(a) ` `    ``len_b ``=` `len``(b) ` `     `  `    ``for` `i ``in` `range``(``0``, len_a): ` `         `  `        ``if` `a[i] ``=``=` `b[``0``]: ` `            ``k ``=` `i ` `            ``count ``=` `1` `            ``for` `j ``in` `range``(``0``, len_b): ` `                 `  `                ``# we are reiterating over A again and  ` `                ``# again for each value of B  ` `                ``# Resetting A pointer back to 0 as B  ` `                ``# is not empty yet ` `                ``if` `k >``=` `len_a: ` `                    ``k ``=` `0` `                    ``count ``=` `count ``+` `1` `                     `  `                ``# Resetting A means count  ` `                ``# needs to be increased ` `                ``if` `a[k] !``=` `b[j]: ` `                    ``break` `                ``k ``=` `k ``+` `1` `                 `  `            ``# k is iterating over A ` `            ``else``: ` `                ``return` `count ` `    ``return` `-``1` ` `  `# Driver Code ` `A ``=` `'abcd'` `B ``=` `'cdabcdab'` `print``(min_repetitions(A, B)) ` ` `  `# This code is contributed by satycool `

## C#

 `// C# program to find minimum number  ` `// of times 'A' has to be repeated  ` `// such that 'B' is a substring of it ` `using` `System; ` `     `  `class` `GFG  ` `{ ` ` `  `// Function to check if a number  ` `// is a substring of other or not ` `static` `Boolean issubstring(String str2,  ` `                           ``String rep1) ` `{ ` `    ``int` `M = str2.Length; ` `    ``int` `N = rep1.Length; ` ` `  `    ``// Check for substring from starting  ` `    ``// from i'th index of main string ` `    ``for` `(``int` `i = 0; i <= N - M; i++)  ` `    ``{ ` `        ``int` `j; ` ` `  `        ``// For current index i,  ` `        ``// check for pattern match ` `        ``for` `(j = 0; j < M; j++) ` `            ``if` `(rep1[i + j] != str2[j]) ` `                ``break``; ` ` `  `        ``if` `(j == M) ``// pattern matched ` `            ``return` `true``; ` `    ``} ` ` `  `    ``return` `false``; ``// not a substring ` `} ` ` `  `// Function to find Minimum number  ` `// of times 'A' has to be repeated  ` `// such that 'B' is a substring of it ` `static` `int` `Min_repetation(String A, String B) ` `{ ` `    ``// To store minimum number of repetations ` `    ``int` `ans = 1; ` `     `  `    ``// To store repeated string ` `    ``String S = A; ` `     `  `    ``// Untill size of S is less than B ` `    ``while``(S.Length < B.Length) ` `    ``{ ` `        ``S += A; ` `        ``ans++; ` `    ``} ` `     `  `    ``// ans times repetation makes required answer ` `    ``if` `(issubstring(B, S)) ``return` `ans; ` `     `  `    ``// Add one more string of A  ` `    ``if` `(issubstring(B, S + A))  ` `        ``return` `ans + 1; ` `         `  `    ``// If no such solution exits  ` `    ``return` `-1; ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main(String[] args)  ` `{ ` `    ``String A = ``"abcd"``, B = ``"cdabcdab"``; ` `     `  `    ``// Function call ` `    ``Console.WriteLine(Min_repetation(A, B)); ` `} ` `} ` ` `  `// This code is contributed by 29AjayKumar `

Output:

```3
```

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.