package com.interview.string;
/**
.Given an input string S write a function which returns true if it satisfies S = nT. Basically you have to find if a given string can be represented from a substring by iterating it �n� times. n >= 2
An example would suffice
Function should return true if
1) S = abab
2) S = abcdabcd
3) S = abcabcabc
4) S = zzxzzxzzx
Function should return false if
1) S = abac
2) S = abcdabbd
3) S = abcabcefg
4) S = zzxzzyzzx
*/
public class NTMatch {
public boolean match(char str[]){
int kmp[] = buildKMP(str);
int index = kmp[str.length-1];
//reason end is this rather than index+1 because
//if our string was ababab for KMP we would have index as 4 at str.length-1 and we
//want end to be 1 rather than 5
int end = str.length - index-1;
if(end >= str.length/2){
return false;
}
int j = end+1;
int i = 0;
while(j < str.length){
if(str[i] != str[j]){
return false;
}
i = (i+1)%(end+1);
j++;
}
if(i == 0){
return true;
}
return false;
}
private int[] buildKMP(char str[]){
int result[] = new int[str.length];
int i =1;
result[0] = 0;
int len =0;
while(i < str.length){
if(str[i] == str[len]){
len++;
result[i] = len;
i++;
}else{
if(len != 0){
len = result[len-1];
}else{
len =0;
result[i] = 0;
i++;
}
}
}
return result;
}
public static void main(String args[]){
NTMatch ntMatch = new NTMatch();
System.out.println(ntMatch.match("bababababa".toCharArray()));
}
}