KMP

来源:互联网 发布:现在淘宝开什么店赚钱 编辑:程序博客网 时间:2024/05/16 01:13
void calculateNext(string p,int *next){    next[0]=-1;    next[1]=0;    for(int i=1;i<p.size()-1;i++){        int k = next[i];        while( p[i]!=p[k]){            if(k == -1){                next[i+1] = 0;                break;            }            k = next[k];        }        if(k != -1)            next[i+1] = k+1;    }}vector<int> KMP(string t,string p){    vector<int> indexVec;        int count=0;    //  calculate next[]    int next[p.size()];    calculateNext(p,next);    printf("next[%d]:",p.size());    for(int i = 0;i < p.size(); i++)        cout<<next[i]<<" ";    cout<<endl;        // pattern match    //     i is cursor on t[]   (base of pattern)    //     j is cursor on p[]   (cursor of match)    int i=0,j=0;    int tl=t.length();    int pl=p.length();    while(i+pl-1 < tl){        while (j < pl){            count++;            if(t[i+j] != p[j]){     // a mismatch found                i += j-next[j];     //   move i to i + j-next[j]                j = next[j];        //   move j to next[j]                if(j==-1)                    j=0;                break;            }            else{                   // keep matching                j++;            }        }        if( j == p.length() ){      // a pattern match is found//            cout<<i<<endl;            indexVec.push_back(i);  //   store index            i += j-next[j];         //   move i to i + j-next[j]            j = next[j];            //   move j to next[j]            if(j == -1)                j=0;        }    }        cout<<"count:"<<count;    cout.flush();    return indexVec;}

0 0
原创粉丝点击