KMP算法next数组解析

KMP算法是一种优秀的字符串匹配算法,但是KMP算法中最难理解的就是next数组了,今天我就用最简单的描述来帮助大家建立next数组 如果有个字符串为char* c= “abcdabcdaef”
然后我们建立一个next数组next[strlen(c)+1]
Target_index 0 1 2 3 4 5 6 7 8 9 10
Target a b c d a b c d a e f
Next_index 0 1 2 3 4 5 6 7 8 9 10
next 0 0 0 0 1 2 3 4 5 0 0
next数组里面的元素值是看前缀和后缀共有元素的长度
当index=0时,没有共有元素,故next[0]=0
当index=1时,”a b”的前缀为”a”,后缀为”b”,无共有元素,故也为0
当index=2时,”abc”的前缀为”a”,”ab”,后缀为”bc”,”c”,故无共有元素,所以next[2]=0;
当index=3时,”abcd”的前缀为”a”,”ab”,”abc”,后缀为”bcd”,”cd”,”d”,故无共有元素,所以next[3]=0;
当index=4时,”abcda”的前缀为”a”,”ab”,”abc”,”abcd”,后缀为”bcda”,”cda”,”da”,”a”,有个共有元素”a”,所以next[4]=strlen(“a”)=1;
同理当index=4时,next[4]=strlen(“ab”)=2;
当index=8时,拥有共有元素“a”,”abcda”,next[4]=strlen(“abcda”)=5;
通过这种分析我们发现 当求next[i]时,我们只需要将Target[i]和Target[next[i-1]]进行比较,如果相等,则next[i]=next[i-1]+1,否则,next[i]=0

#include <stdio.h>
#include <string.h>
void GetKMP(char* target,int target_length,int next[]);
int main()
{
    char* s="aabbccddaabbccdde";
    int* next=new int[strlen(s)];
    GetKMP(s,strlen(s),next);
    for(int i=0;i<strlen(s);i++)
    {
        printf("%d ",next[i]);
    }
    return 0;
}

void GetKMP(char* target,int target_length,int next[])
{
    next[0]=0;
    int j;
    for(int i=1;i<target_length;i++)
    {
        j=next[i-1];
        if(target[j]==target[i])
        {
            next[i]=next[i-1]+1;
        }
        else
        {
            next[i]=0;
        }
    }
}

这里写图片描述
现在大家应该明白了吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值