实现代码:
#include <iostream>
#include <cstring>
using namespace std;
//获取next数组 递推法
// void get_next(char* t, int next[]) {
// int k, j;
// next[0] = -1;
// for (j = 1; t[j]; j++) {
// k = next[j - 1]; //t[0...k-1] = t[j-k-1...j-2]
// while (k != -1 && t[k] != t[j - 1]) k = next[k]; //k < next[k] k不断缩小直至找到满足条件的最大k
// next[j] = k + 1;
// }
// }
//改进next数组
void get_nextval(char *t, int nextval[]){
nextval[0] = -1;
int k = -1, j = 0; //j和k指向第一个元素
while(t[j]){ //遍历字符串
if(k == -1 || t[k] == t[j]){
k++;
j++; //移向下一个元素
if(t[k]!=t[j]){
nextval[j] = k;
}else{
nextval[j] = nextval[k];
}
}else{
k = nextval[k];
}
}
}
//KMP算法
int index_kmp(char* s, char* t, int next[]) {
get_nextval(t, next);
int i, j;
i = j = 0;
while (s[i] && (j == -1 || t[j])) {
if (j == -1 || s[i] == t[j]) {
i++;
j++;
}
else {
j = next[j]; //回溯
}
if (!t[j]) {
return i - j;
}
}
return -1; //没找到返回-1
}
int main()
{
char s[] = "dahdwaabaabcacwhwjj";
char t1[] = "abaabcac";
char t2[] = "aaabaa";
int nextval[20];
get_nextval(t2, nextval);
for (int i = 0; i < strlen(t2);i++){
cout << nextval[i] <<" ";
}
}