KMP算法代码
主要函数参考严蔚敏数据结构
代码:
#include <stdio.h>
#include <string.h>
#define maxsize 100
typedef char SString[maxsize];
void get_nextval(SString T, int nextval[])
{
int lenT = strlen(T);
int i = 1;
int j = 0;
nextval[1] = 0;
while (i < lenT)
{
if (j == 0 || T[i] == T[j])
{
i++;j++;
if (T[i] != T[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
}
int Index_KMP(SString S,SString T,int pos)
{
//pos:从0开始往后查找
int i = pos, j = 0, lenS, lenT;
lenS = strlen(S);
lenT = strlen(T);
int nextval[maxsize];
get_nextval(T, nextval);
while (i <= lenS&&j < lenT)
{
if (j == 0 || S[i] == T[j]) {
++i; ++j;
}
else j = nextval[j];
}
if (j == lenT)
{
printf("匹配成功!\n");
return i-lenT;
}
else
{
printf("匹配失败!\n");
return -1;
}
}
int main()
{
SString S, T;
printf("请输入S串:");
scanf("%s", S);
printf("S串:%s\n", S);
printf("请输入T串:");
scanf("%s", T);
printf("T串:%s\n", T);
printf("匹配成功位置:%d\n", Index_KMP(S,T,0));
return 0;
}
/*
acabaabaabcacaabc
abaabcac
*/
运行结果: