## Google Interview Question

Software Engineers**Country:**United States

```
public static void main(String[] args) {
String A = "abcd";
String B = "cdabcdabcdabcdab";
String temp = "";
int len = B.length() / A.length();
for(int i=0; i<len; i++) {
temp = temp + A;
}
while(len<=(B.length() / A.length() + 1)) {
if(temp.contains(B)) {
System.out.println(len);
break;
}else {
len++;
temp = temp+A;
}
}
}
```

Runtime O(m+n), Space O(1)

```
public static int NumOfRepeatsToGetSubstring(string i_A, string i_B)
{
int count = 1;
int a = 0, b = 0;
while (b < i_B.Length)
{
if (i_A[a] == i_B[b])
{
++b;
}
else if (count > 1)
{
count = -1;
break;
}
++a;
if (a == i_A.Length)
{
a = 0;
++count;
}
}
return count;
}
```

```
The test string never needs to be longer than A + B + A.
function getRepetitions(A, B) {
var test = "", repetitions = 0, max;
if (A.length < B.length)
max = B.length + (A.length * 2);
else
max = A.length * 2;
while (test.length <= max) {
test += A;
repetitions++;
if (test.indexOf(B) != -1) { // I'm not sure if including test.length >= B.length would improve performance here
return repetitions;
}
}
return -1;
}
```

```
/*
Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.
For example, with A = "abcd" and B = "cdabcdab".
Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").
Note:
The length of A and B will be between 1 and 10000.
*/
console.log(isRepeat('abcd','bcdabcdab'));
function isRepeat(seed, target){
let tmp = seed;
let count = 1;
for (; tmp.length < target.length; count++) {
tmp+= seed
}
if (tmp.indexOf(target) !==-1) {
return count;
}
return -1;
}
/*
Complixity is o(n).
you can always use KMP algorithem to implement indexOf which has o(n)
*/
```

If B matches repeated A that means B can be written as <S><A...><P> where <S> is any suffix of A including empty suffix, <A...> is A repeated some number of times including zero times and <P> is any prefix of A including empty prefix. Let len(A) = N, len(B) = M then ans is 1 (if non-empty S exists) + number of times A is repeated + 1 (if non-empty P exists):

- ashu1.220791 July 07, 2019<S> and <P> can be checked to exist in O(N*N) while individual <A> can be checked in N time and there might be at max ceil(M/N) times <A> in B.

If this pattern is not matched, return -1.