KMP算法
void getNext(int* nxt, string p){
memset(nxt, -1, sizeof(nxt));
nxt[0] = -1;
int i = 0,j = -1;//j控制前缀,i控制后缀
int lp = p.size();
while( i<lp ) {
if( j==-1||p[i]==p[j] ){
++i;
++j;//先自增,因为PMT向前移动一位
nxt[i]=j;
}
else j=nxt[j];
}
}
int kmp(string t, string p){
int i = 0, j = 0;
int lt = t.size(), lp = p.size();
int nxt[lp+1];
getNext(nxt, p);
while( i<lt&&j<lp ) {
if( j==-1||t[i]==p[j] ) {
i++;
j++;
}else {
j=nxt[j];
}
}
if( j==lp ) return i-j;
else return -1;
}