KMP算法求next

数组第一位放元素个数,要做题目的话可以把char数组做的足够大,或者用vector 。

next 中存放的值已经说明,他可以与前面的值等或不等,若4!=a ,那么k的指针也不会指向b(继续判断)

而next[++j]=k;

++j 是先加后使用,用于向下判断

 

对用例进行手算:

例:        a b a a b c a c

前缀                     next                注

[ a ]                   next = 0 ;        //初始化

[ a b ]                next = 1 ;        //0+1=1

[ a b a ]             next = 2 ;        // a==a ,1+1=2

[ a b a ]          next = 2 ;        // a==a,1+1=2

[ a b a a b ]       next = 3 ;        // (前一步,有 a==a ) b==b,2+1=3

[ a b a a b c ]    next = 1 ;        //0+1=1

[ a b a a b c a ] next = 1 ;        //1+1=2

End

#include <iostream>
#include <vector>

using namespace std;

char *getNext(char a[]);
int main()
{
    char a[9]={8,'a','b','a','a','b','c','a','c'};
    char *next=getNext(a);
    for(int i=1;i<a[0]+1;i++)
        printf("%d ",next[i]);
    free(next);
    return 0;
}
char *getNext(char a[])
{

    char *next=(char*)malloc(sizeof(char)*( (int)(a[0])+1 ));
    int k=0,j=1;
    next[1]=0;
    while(j<a[0])
    {
        if(k==0||a[j]==a[k]) next[++j]=++k;
        else    k=next[k];
    }
    return next;
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值