注意 :next数组中,最大的数表示字符串中最长的回文串的长度,回文串可以看成自己的前缀和后缀组成,日后可以用来解决不少问题。
#include <iostream>
#include<string.h>
using namespace std;
void get_next(char*t, int next[ ])
{
//确定匹配失败的时候模式串返回的位置
int t_len=strlen(t),i=0,j=-1;
next[0]=-1; //递推基本条件,然后求解next[i+1]
while(i<t_len)
{
if(j==-1 ||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j]; //确定匹配失败的时候模式串返回的位置
}
}
int KMP(char *s,char *t)
{
int i=0, j=0;
int s_len=strlen(s);
int t_len=strlen(t);
int *next=new int[t_len];
get_next(t,next);
while(i<s_len&&j<t_len)
{
if(j==-1||s[i]==t[j])// next[0]=-1
{
i++;
j++;
}
else
j=next[j];
}
if(j==t_len)
return i-j;
else
return -1;
}
int main(void)
{
char *s="abcdasdefghijklmnefgh";
char *t="efgh";
cout<<KMP(s,t)<<endl;//输出了模式串t在s中第一个字符的位置
return 0;
}