#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void getNextArray(char * sub_str, int sub_str_length, int * next_array);
int kmpSearch(char * sub_str, char * main_str);
int main(void) {
// 1 声明用于算法处理的字符串
char origin_str[] = "ababcababce";
char sub_str[] = "ababce";
//2 调用算法查找
int index = kmpSearch(sub_str, origin_str);
printf("找到了 下标为:%d ", index);
return 0;
}
void getNextArray(char * sub_str, int sub_str_length, int * next_array) {
next_array[0] = 0;
int j = 0;
for (int i = 1; i < sub_str_length; i++) {// 这里的i控制的是子串的遍历
while (j > 0 && sub_str[j] != sub_str[i]) // 处理不相同的情况 因为不相同可能有连续多个
{
j = next_array[j - 1]; // 向前移动
}
if (sub_str[j] == sub_str[i]) // 相同
{
j++;
}
next_array[i] = j;
}
return;
}
int kmpSearch(char * sub_str, char * main_str) {
// 1 计算next数组
int sub_str_length = strlen(sub_str);
int * next_array = (int *)malloc(sub_str_length * sizeof(int));
getNextArray(sub_str, sub_str_length, next_array);
// 输出 next 数组
for(int i = 0; i < sub_str_length; i++) {
printf("%d ", next_array[i]);
}
printf("\n");
// 2 查找部分
int main_str_length = strlen(main_str);
int i = 0;
int j = 0;
while (i < main_str_length)
{
if (main_str[i] == sub_str[j])
{
i++;
j++;
} else {
j = next_array[j];
}
if (j == sub_str_length)
{
free(next_array);
return i - j; // 返回匹配到的起始索引
}
}
// 释放内存
free(next_array);
return -1;
}
运行效果