【数据结构】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]存的是返回的下标

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要计算出字符串的长度,也就是 n=9。 接下来,我们需要根据 KMP 算法的思想,求出字符串的 next 数组。KMP 算法中 next 数组的含义是: next[i] 表示当第 i 个字符失配时,模式串需要跳转到的位置。 我们从模式串的第二个字符开始计算 next 值,因为 next[0]=-1 是一个特殊值。我们可以将模式串看成两个部分:前缀和后缀。其中前缀表示除了最后一个字符以外,字符串的全部头部组合;后缀表示除了第一个字符以外,字符串的全部尾部组合。 以 aaaaaababc 为例,我们可以得到如下的 next 数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |----|---|---|---|---|---|---|---|---|---| | s | a | a | a | a | a | b | a | b | c | | next[i] | -1 | 0 | 1 | 2 | 3 | 0 | 1 | 2 | 0 | 计算 next 数组的过程如下: 1. next[0]=-1,next[1]=0 2. 对于 i=2,s[0] 和 s[1] 相同,所以 next[2]=1 3. 对于 i=3,s[0] 和 s[2] 相同,所以 next[3]=2 4. 对于 i=4,s[0] 和 s[3] 相同,所以 next[4]=3 5. 对于 i=5,s[0] 和 s[4] 不同,但是 s[1] 和 s[5] 相同,所以需要回退到 next[1] 的位置,即 0,所以 next[5]=0 6. 对于 i=6,s[0] 和 s[5] 不同,但是 s[1] 和 s[6] 不同,但是 s[2] 和 s[6] 不同,但是 s[3] 和 s[6] 不同,但是 s[4] 和 s[6] 不同,但是 s[5] 和 s[6] 相同,所以需要回退到 next[0] 的位置,即 -1,所以 next[6]=-1 7. 对于 i=7,s[0] 和 s[6] 不同,但是 s[1] 和 s[7] 相同,所以需要回退到 next[1] 的位置,即 0,所以 next[7]=0 8. 对于 i=8,s[0] 和 s[7] 不同,但是 s[1] 和 s[8] 不同,但是 s[2] 和 s[8] 相同,所以需要回退到 next[2] 的位置,即 1,所以 next[8]=1 所以,aaaaaababc 的 next 数组为:-1,0,1,2,3,0,1,2,0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值