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 timesInput : 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++
// 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; } |
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 |
3
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.