##**KMP算法(C语言实现)
**此次KMP算法的实现离不开印度三哥的教学,资源在b站av3246487
在他的KMP算法的思想中,建立临时数组,next,有助于更好地利用前缀和后缀相同
从而减少比较量
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void KMP(char a[], char b[]);
void main(){
char a[80];
char b[10];
printf("请输入主串:");
gets_s(a);
printf("\n请输入子串:");
gets_s(b);
KMP(a, b);
}
void KMP(char a[], char b[]) {
int i,j,t,m;
t = strlen(b);
int c[80];
int d[20];
c[0] = 0;
for (i = 0, j = 1;;) {//建立临时数组,为c
if (j == strlen(b)) {//当j到尽头时,就会让i通过查找临时数组的前一个单元存储的元素为i的下一个位置
if (i == 0) {
break;
}
i = c[i - 1];
if (b[i] == b[j]) {
c[j] = i + 1;
break;
}
}
else{
if (b[i] != b[j]) {//当找到两个相同的的时候,i和j同时向后移
c[j] = 0;
j++;
}
else {//不相同时,j后移,i不变
c[j] = i + 1;
i++;
j++;
}
}
}//到这里我已经知道了数组c里存的是什么玩意儿啦,存的就是特殊的临时数组
for (i = 0, j = 0, t = 0; ; ) {//进行主串和子串之间的判断,找到不相同的时候再参考临时数组,找到主串中的元素应于子串中的第几个进行比较
if (a[i] == b[j]) {
if (j == strlen(b)) {//找到相同的
t = i - strlen(b)+1;
break;
}
j++;
i++;
}
else
i++;
if(a[i] != b[j] && j >= 2) {//只有长度大于2才有可能出现相同的前缀和后缀,也就才可以改变j的值
m = c[j - 1];
j = c[m];
}
}
printf("位置如下:");
printf("%d", t);
}