#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]; cout<<next[j]<<" "; } else { k = next[k]; } } } 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; } } }//while delete []next; if(Pattern[j]=='\0') return index;// 匹配成功 else return -1; } int main()//abCabCad { char* text="l love youyouyour"; char*pattern="your"; //getNext(pattern,n); //get_nextval(pattern,n); cout<<KMP(text,pattern)<<endl; return 0; }
你可以试下用Sunday匹配算法,比KMP要简单并且速度快。
字符串的模式匹配终究是匹配字符串,匹配条件都是求相等序列,就算是int数组也都是一个流程,感觉不能怎么优化。 要说优化的话,只能从存储方式下手,位运算效率最高,比较二进制还是应该在位作为单位的环境下存储和比较。 lz把二进制转成数组,最终还要转成二进制的吧,效率多低。
//
69,382
社区成员
243,073
社区内容
加载中
试试用AI创作助手写篇文章吧