KMP算法

来源:互联网 发布:剑网3御姐捏脸数据 编辑:程序博客网 时间:2024/06/07 11:37
// KMP算法中一个很重要的就是next数组// next[j]表示子串满足P[0...k-1]=p[j-k...j-1]的最大的k// 根据定义next[0]=-1// 如果 p[j]==p[k],则由p[j-1]=k-1知next[j]=p[j-1]+1=k// 如果 p[j]!=p[k],则可以看成匹配失败的情况,k将转移到next[k]#include<cstring>void getNext(char *s,int *next){    // s是子串    int j=0,k=-1;    int sLen=strlen(s)-1;    next[0]=-1;    while(j<sLen){        if(k==-1||s[j]==s[k]){            next[++j]=++k;        }else{            k=next[k];        }    }    return;}int KMP(char *p,char *s){           // s是子串    int i=0,j=0;    int pLen=strlen(p);    int sLen=strlen(s);    int *next=new int[sLen];    getNext(s,next);    while(i<pLen&&j<sLen){        if(j==-1||p[i]==s[j]){            ++i;++j;        }else{            j=next[j];        }    }    delete [] next;    if(j==sLen) return i-j;    return -1;}#include<iostream>using namespace std;int main(){    char p[]="To be Number One";    char s[]="Num";    cout<<KMP(p,s)<<endl;    return 0;}


0 0
原创粉丝点击