KMP算法标准模板

来源:互联网 发布:淘宝排名的影响因数 编辑:程序博客网 时间:2024/05/16 07:50

#include <iostream>#include <cstdio>#include <cstring>#define MAXN 10+1000using namespace std;//P[0]不使用,P[i]表示B串的前i个字符中, 前P[i]个字符和后P[i]个字符相同int Next[MAXN];char* KMP(char* A, char* B);    //返回B串在A串中的位置 B串:模式串 A串:待匹配串void build_next(char *B);            //将B串(模式串)进行自我匹配char a[]="ababababbc";char b[]="ababbc";int main(){     build_next(b);     char *idx = KMP(a, b);     if(!idx)         puts("b is not a's substring.");     else         printf("b is a's substring, the index is %d\n",idx-a);     return 0;}char* KMP(char *A, char *B){     int len1=strlen(A), len2=strlen(B);     int i, j=0;                 //j代表目前B串中已与A串匹配了的字符的个数     for(i=0; i<len1; ++i)     {         while(j>0 && A[i]!=B[j])    //0...j-1,已匹配了j个字符,sub[j]是sub的第j+1的字符,因为下标从0开始             j = Next[j];         if(A[i] == B[j])             ++j;         if(j == len2)              //当j(B中已匹配了的字符串的个数)与B串本身长度相等时,说明匹配完毕             return A+i-j+1;        //此时可计算出指针位置     }     return NULL;}void build_next(char *B){     Next[0] = 0;     Next[1] = 0;     int i, j=0, len=strlen(B);     for(i=2; i<len; ++i)     {          /*while(j>0 && B[j]!=B[i-1]), 这里的j代表        在比较第i个字符(从1开始数)和B[j]时,前i-1个字符中的前j个字符和后j的字符相同        B[j]代表第j的字符(从1开始数)的下一个字符*/         while(j>0 && B[j]!=B[i-1])     //如果第i个字符和第j个字符的下一个字符(即B[j])不同,则改变j的值,再重新比较             j = Next[j];         if(B[j] == B[i-1])             ++j;         Next[i] = j;     }}

下面是主要代码部分:

char* KMP(char *A, char *B){     int len1=strlen(A), len2=strlen(B);     int i, j=0;                 //j代表目前B串中已与A串匹配了的字符的个数     for(i=0; i<len1; ++i)     {         while(j>0 && A[i]!=B[j])    //0...j-1,已匹配了j个字符,sub[j]是sub的第j+1的字符,因为下标从0开始             j = Next[j];         if(A[i] == B[j])             ++j;         if(j == len2)              //当j(B中已匹配了的字符串的个数)与B串本身长度相等时,说明匹配完毕             return A+i-j+1;        //此时可计算出指针位置     }     return NULL;}void build_next(char *B){     Next[0] = 0;     Next[1] = 0;     int i, j=0, len=strlen(B);     for(i=2; i<len; ++i)     {          /*while(j>0 && B[j]!=B[i-1]), 这里的j代表        在比较第i个字符(从1开始数)和B[j]时,前i-1个字符中的前j个字符和后j的字符相同        B[j]代表第j的字符(从1开始数)的下一个字符*/         while(j>0 && B[j]!=B[i-1])     //如果第i个字符和第j个字符的下一个字符(即B[j])不同,则改变j的值,再重新比较             j = Next[j];         if(B[j] == B[i-1])             ++j;         Next[i] = j;     }}



0 0
原创粉丝点击