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

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

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find Minimum number of times A 
// has to be repeated such that B is a substring of it
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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.