【数据结构】KMS模式匹配算法

1、KSM模式匹配字符串图示

在这里插入图片描述

2、代码:

int next[MAXSIZE];//next数组,保存的内容是与T对应的,每一个对应的内容就是当T[j]!=S[i]时,j就回退到next[j],i不变。可以降低时间复杂度
void get_next(char *T,int next[])
{
    int j,k;
    j=0;k=-1;
    next[0]=-1;
    while(j<strlen(T)-1){
        if(k==-1||T[j]==T[k]){
            j++;k++;
            next[j]=k;
        }else{
            k=next[k];
        }
    }
}
int Index_KMP(char *S,char *T,int pos)
{
    int i=pos,j=0;
    get_next(T,next);
    for(j=0;j<20;j++){
    }
    j=0;
    while(i<strlen(S)&&j<strlen(T)||j==-1){
        if(j==-1||S[i]==T[j]){
            i++;
            j++;
        }else{
            j=next[j];
        }
    }
    if(j>=strlen(T)){
        return (i-strlen(T));
    }else{
        return -1;
    }
}
//改进后的next算法
void get_next2(char *T,int next[])
{
    int j,k;
    j=0;k=-1;
    next[0]=-1;
    while(j<strlen(T)-1){
        if(k==-1||T[j]==T[k]){
            j++;k++;
            if(T[j]!=T[k]){
                next[j]=k;
            }else{
                next[j]=next[k];
            }
        }else{
            k=next[k];
        }
    }
}

3、代码解析

如果在S字符串中匹配字符串T,则数组next中的每一个元素都和匹配字符串T的每一个元素相对应。

next中存的是:当在循环判断时,S[i]和T[j]不等时,j=next[j],i不变。next[j]代表的是在j这个地方出错时,重新遍历匹配字符串的起点。next[j]存的是返回的下标

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