KMP算法(具体求串的next[n])
怎么求串的模式值next[n]
(1)next[0]= -1 意义:不论什么串的第一个字符的模式值规定为-1。
(2)next[j]= -1 意义:模式串T中下标为j的字符,假设与首字符
同样,且j的前面的1—k个字符与开头的1—k
个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k 意义:模式串T中下标为j的字符,假设j的前面k个
字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
即T[0]T[1]T[2]。
。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
且T[j] != T[k].(1≤k<j);
(4) next[j]=0 意义:除(1)(2)(3)的其它情况。
#include <iostream.h> //#include <string.h> void get_nextval(const char *T, int next[] ) { // 求模式串T的next函数值并存入数组 next。 int j = 0, k = -1; next[0] = -1; while ( T[j] != '\0' ) { if (k == -1 || T[j] == T[k]) { ++j; ++k; if (T[j]!=T[k]) next[j] = k; else next[j] = next[k]; } else k = next[k]; } // 这里是我加的显示部分 for(int i=0;i<j;i++) { cout<<next[i]<<endl; } cout<<endl; } /////////////////////////////////////////////////////////// int KMP(const char *Text,const char* Pattern) { if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' ) return -1;//空指针或空串,返回-1。 int len=0; const char * c=Pattern; while(*c++!='\0') { ++len; } int *next=new int[len+1]; get_nextval(Pattern,next);//求Pattern的next函数值 int index=0,i=0,j=0; while(Text[i]!='\0' && Pattern[j]!='\0' ) { if(Text[i]== Pattern[j]) { ++i; ++j; } else { index += j-next[j]; if(next[j]!=-1) j=next[j];// 模式串向右移动 else { j=0; ++i; } } } delete []next; if(Pattern[j]=='\0') return index;// 匹配成功 else return -1; } int main() { char* text="babadCadCaaaaa"; char*pattern="adCad"; cout<<KMP(text,pattern)<<endl; return 0; }