数组第一位放元素个数,要做题目的话可以把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 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;
}