作者:silence、2012年5月19日
本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处
#include <cstdlib>
#include <iostream>
/*
Author : silence
Time : 2012/5/19
Description : KMP算法的next[]
*/
using namespace std;
void next(char T[],int L,int next[])
{
//字符串指针
int i =0;
//next[j]=k j表示最后一个匹配位置,k表示j的前k位和开头前K位匹配
next[0]= -1;
int j =-1;
while(i<L)
{
if(j==-1||T[i]==T[j])
{
++i;
++j;
next[i] =j ;
}
else
j=next[j];
}
}
void get_next(string s,int next[])
{
int length=s.length();
int i=0,j=-1;
next[0]=-1;
while(i<length)
{
if(j==-1||s[i]==s[j]) /*s[i]表示后缀的单个字符*/
/*s[j]表示前缀的单个字符*/
{
++i;
++j;
next[i]=j;
}
else
j=next[j]; /*若j值不相同,则j值回溯*/
}
}
int main(int argc, char *argv[])
{
char T[] ={'a','b','c','d','a','b','c','e'};
int nextarr[10];
next(T,8,nextarr);
for(int i = 0;i<8;i++)
cout<<T[i]<<" ";
cout<<endl;
for(int i = 0;i<8;i++)
cout<<nextarr[i]<<" ";
cout<<endl;
string s = "abcdabce";
get_next(s,nextarr);
for(int i = 0;i<8;i++)
cout<<nextarr[i]<<" ";
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
书上的代码:
void get_next(SString T, int &next[])
{
//求模式串T的next函数值并存入数组next
i = 1; next[1] = 0; j = 0;
while (i < T[0])
{
if(j ==0 || T[i] == T[j])
{
++i; ++j; next[i] = j;
}
else
{
j = next[j];
}
}
}
1 当前i=20,j=8;表示p0-p7和p11-p19相等
2 T[20]==T[8] next[21]=9 增长一个
2.1 T[20]!=T[8] j= next[8]=3,j=3 next[8]=3表示p0-p2等于p5-p7 T[8]!=T[3]
T[8]和T[20]失配,但是next[20]=8也就是20之前的8位和开头的8位匹配,
应该在20之后的8位继续查找匹配项,20之后的8项就是开头的8位
j=next[8]表示在开头的8位查找 next[8]=3也就是头三位和8的前三位相等也就是和20之前的三位相等 所以next[21]=++j,增加一位