public int[] kmpNext(String s) {
char[] chs=s.toCharArray();
int[] n=new int[chs.length];
if(s.length()==0)
return n;
for(int i=1;i<n.length;i++) {
int p=i-1;
while(n[p]!=0&&chs[i-1]!=chs[n[p]-1]) {
p=n[p]-1;
}
if(n[p]==0) {
n[i]=1;
}
else {
n[i]=n[p]+1;
}
}
n[0]=1;
return n;
}
public static String strStr(String haystack, String needle) {
int[] n=kmpNext(needle);
int s=0;
for(int i=0;i<haystack.length()-needle.length()+1;i++){
boolean flag=true;
for(int j=s;j<needle.length();j++){
if(needle.charAt(j)!=haystack.charAt(i+j)){
flag=false;
s=n[j]-1;
break;
}
}
if(flag){
return haystack.substring(i);
}
}
return null;
}