next函数

来源:互联网 发布:奇兔刷机软件电脑 编辑:程序博客网 时间:2024/06/05 18:29
//递推求解#include <string.h>int* getNext( char*  pattern) {    int len=strlen(pattern);    int* next=new int[len];//动态创建内存    next[0]=-1;    for(int i=1; i<len; i++)    {        int j=next[i-1];        while(j!=-1 && pattern[j]!=pattern[i-1])            j=next[j];        if(j==-1)            next[i]=0;        else            next[i]=j+1;    }    return next;}



//非递推算法

void getNext(char* p ,int next[], int len){for(int i=0; i<len; i++)next[i]=-1;next[1]=0;for(int k=2; k<len; k++){for(int i=1; i<k; i++){int m=i;int n=0;while(m!=k && p[m]==p[n]){m++;n++;}if(m==k){next[k]=n;break;}}if(next[k]==-1)next[k]=0;}for(i=0; i<len; i++)cout<<next[i]<<" ";cout<<endl;}



完整的KMP算法实现

#include <IOSTREAM.H>#include <string.h>void getNext(char* p, int* next, int len){next[0]=-1;for(int i=1; i<len; i++){int j=next[i-1];while(p[j]!=p[i-1] && j>-1)j=next[j];if(j==-1)next[i]=0;elsenext[i]=j+1;}}void match(char* dest, char* pattern){int p_len=strlen(pattern);int* next=new int[p_len];getNext(pattern,next,p_len);int i=0;int j=0;int dest_len=strlen(dest);while(i<dest_len){while(i<dest_len && j<p_len){if(dest[i]==pattern[j]){i++;j++;}else{next[j]!=-1 ? j=next[j] : i++,j=0;//三目运算符,等同于if else语句!}}if(j==p_len)cout<<i-j<<endl;i++;j=0;}/*    while(i!=slen && j!=tlen)    {        if(s[i]==t[j])        {            i++;            j++;        }        else        {            j=next[j];            if(j==-1)            {                i++;                j=0;            }        }    }    IF(J==TLEN)。。。.    ELSE。。。*/ } void main(){char* dest="abcdcdcdcfjcdadbcdfjdbdfeed";char* pattern="cdc";match(dest,pattern);}



原创粉丝点击