1. 程式人生 > 實用技巧 >模式匹配演算法-kmp

模式匹配演算法-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; }