串的模式匹配、KMP算法、nextval数组求法

一、暴力匹配

#include 
using namespace std;
#define MAXLEN 255
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;
//S为主串,T为子串

//暴力匹配
int Index(SString S,SString T){
    int i=1,j=1;
    int k=1;
    while(i<=S.length && j<=T.length){
        if(S.ch[i]==T.ch[j]){
            i++;
            j++;
        }else{
//            i的第二种取值
//            k++;
//            i=k;
            i=i-j+2;
            j=1;
        }
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}

二、KMP算法——next数组

#include 
using namespace std;
#define MAXLEN 255
typedef struct{
    char ch[MAXLEN];
    int length;
}SString;
//S为主串,T为子串

//KMP-next
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;
}

 三、nextval数组的求法

//next->nextval
void get_nextval(SString T,int nextval[],int next[]){
    nextval[1]=0;
    for(int j=2;j<=T.length;j++){
        if(T.ch[next[j]]==T.ch[j])
            nextval[j]=nextval[next[j]];
        else
            nextval[j]=next[j];
    }
}

然后把KMP算法中的next数组替换成nextval数组即可,匹配算法不变。

你可能感兴趣的:(数据结构)