void getNext(char * p, int * nxt){
nxt[0] = -1;
int i=0, j=-1;
// 注意这里跳出的条件是i==strlen(p)
// 所以其实只要扫一遍pattern就可以求出nxt数组
// 要区别kmp
while(i<strlen(p)){
if(j==-1||p[i]==p[j]){
// 注意是先自增再赋值nxt数组
// 这样可以让pmt偏移一位成为nxt
j++;
i++;
nxt[i] = j;
}
else{
j = nxt[j];
}
}
}
int kmp(char * t, char * p){
int i = 0;
int j = 0;
while(i<strlen(t)&&j<strlen(p)){
if(j==-1||t[i]==p[j]){
i++;
j++;
}
else j = nxt[j];
}
// 匹配完了pattern
// 返回在text中找到的起始位置
// 注意这里的pattern和text的下标都是从0开始的
if(j==strlen(p)){
return i-j;
}
// 找不到返回-1
else return -1;
}
原文:https://www.cnblogs.com/xuwanwei/p/14673049.html