char* GetNext(char* shortstr) {
char* next = (char*)malloc(sizeof(char) * strlen(shortstr));
int i = 0, j = -1;
next[0] = -1;
while (i < (int)strlen(shortstr) - 1) {//由于下面有i++,为了防止i的值超过开辟空间范围,故(int)strlen(shortstr) - 1
if (j == -1 || shortstr[j] == shortstr[i]) {
i++; j++;
next[i] = j;
}
else
j = next[j];
}
return next;
}
int StrMatchByKMP(char* longstr, char* shortstr) {
char* next = GetNext(shortstr);
int l = 0, s = 0;
while (l < (int)strlen(longstr) && s < (int)strlen(shortstr)) {//由于strlen返回无符号数,故需要强制类型转换才能与有符号正数进行比较
if (s == -1 || longstr[l] == shortstr[s]) {
l++; s++;
}
else
s = next[s];
}
free(next);
return l - s + 1;
}
参考教学视频:KMP算法实例详解(易懂)_哔哩哔哩_bilibili



