KMP

来源:互联网 发布:小度掌柜商家版mac 编辑:程序博客网 时间:2024/06/05 19:14
#include <iostream>#include <string.h>using namespace std;void get_nextval(const char *T, int next[]){// 求模式串T的next函数值并存入数组 next。int j = 0, k = -1;next[0] = -1;while ( T[j/*+1*/] != '\0' ){if (k == -1 || T[j] == T[k]){++j; ++k;if (T[j]!=T[k])next[j] = k;elsenext[j] = next[k];}// ifelsek = next[k];}// while}// get_nextval int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。{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;}}}//whiledelete []next;if(Pattern[j]=='\0')return index;// 匹配成功elsereturn -1;      }int main()//abCabCad{char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc";char*pattern="adCadCad";//getNext(pattern,n);//get_nextval(pattern,n);cout<<KMP(text,pattern)<<endl;return 0;}


http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
原创粉丝点击