KMP算法是字符传当中判断是否包含另外一个字符串的优化方法,比bf算法常用的多
#include<stdio.h>
#include<string.h>
typedef char* String;
void get_next(String T,int *next)//获得next数组
{
int i=1;
int j=0;
next[1]=0;
while(i<T[0])
{
if(0==j||T[i]==T[j])
{
i++;
j++;
next[i] = j;
}
else
{
j=next[j];//j回溯
}
}
//前缀是固定的,后缀是相对的
//我的爱是单方面的,她的讨厌是绝对的
}
//返回子串T在主串S第pos个字符串之后的位置
int Index_KMP(String S,String T,int pos )
{
int i=pos;
int j=1;
int next[255];
get_next(T,next);
while(i<S[0]&&j<=T[0])
{
if(0==j||S[i] == T[j])
{
i++;
j++;
if(T[i] != T[j])
{
next[i]=j;
} else
{
next[i]=next[j];
}//最优解法
}
else
{
j=next[j];
}
}
if(j>T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
int main()
{
char str[255] = " ababaaaba";
//前面留一个空格用来输入字符串的长度
int next[255];
char str2[255] = " acvdababaaaba";
//这个空格必须要留,但不必输入它的长度
int i = 1;
str[0]=9; //字符串的长度
printf("%d\n",Index_KMP(str2,str,1));
return 0;
}