返回顶部

模式匹配算法-kmp

#include<iostream>
#include<string.h>
using namespace std;
#define MAXLEN 255
//预定义最大串长为255
typedef struct {
    char ch[MAXLEN];
    int length;
} SString;
typedef struct {
    char *ch;
    int length;
} HString;
void copy(SString *T,char*s) {
    int length=strlen(s);
    for(int i=0; i<length; i++) {
        (*T).ch[i+1]=s[i];
    }
    (*T).length=length;
}
int Index(SString S, SString T) {
    int i=1, j=1;
    while(i<=S.length&&j<=T.length ) {
        if (S.ch[i] ==T.ch [j] ) {
            ++i;
            ++j; //继续比较后继字符
        } else {
            i=i-j+2;
            j=1; //指针后退重新开始匹配
        }
    }
    if(j>T.length)
        return i-T.length;

    else return 0;
}

void get_next(SString T,int next[]) {
    int i=1,j=0;
    next[1]=0;
    while(i<T.length ) {
        if (j==0||T.ch[i]==T.ch[j]) {
            ++i ;
            ++j;
            next[i]=j; //若Pi=Pj ,则next[j+1] =next[j]+1
        } else
            j=next[j]; //否则令j=next[j]循环继续
    }
}
int Index_KMP(SString S, SString T, int next[]) {
    int i=1,j=1 ;
    while(i<=S.length&&j<=T.length) {
        if (j==0||S.ch[i]==T.ch [j]) {
            ++i;
            ++j;//继续比较后继字符
        } else
            j=next [j];//模式串向右移动
    }
    if (j>T.length )
        return i-T.length;
    else
        return 0;
}

void get_nextval(SString T ,int nextval[]) {
    int i=1, j=0;
    nextval[1]=0;
    while (i<T.length ) {
        if (j==0||T.ch [i]==T.ch[j]) {
            ++i,++j;
            if (T.ch[i]!=T.ch[j]) nextval[i]=j ;
            else nextval [i] =nextval[j];
            }
            else
            j=nextval[j];
        }
}
int main() {

    SString S,T,K;
    char *s1="12345678";
    char *s2="234";
    copy(&S,s1);
    copy(&T,s2);
    char *s3="aabaabaabaac";
    copy(&K,s3);
    

    int next_val[13];
//    get_nextval(K,next_val);
    get_next(K,next_val);
    for(int i=1;i<=12;i++)
    {
        cout<<next_val[i]<<" ";
    }
    cout<<endl;
cout<<Index_KMP(S, T, next_val);
//    cout<<    Index(S,T);
    return 0;
}

 

posted @ 2020-08-01 20:26  tianyudizhua  阅读(146)  评论(0编辑  收藏  举报