KMP算法求next

KMP求取子串位置KMP算法-CSDN博客

思路:

        查找当前串头与尾部,相同且连续的字符个数,举例

        abbfeab                     当前最长前后缀为1(从0开始计数)

        abbfeabb                   当前最长前后缀为2

        abbfeabbc                 当前最长前后缀为-1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char c[]="ababaaababaa";        
	char *next=NULL;
	char i=0,j=0;    //i:前缀位置;j:后缀位置

    int len=strlen(c);
    next =  (char *)malloc(strlen(c));  
    len--;next[0]=-1;//默认next为-1
    
	while(j<len)                   //遍历c,求得next       
	{
		if(j==0||c[i]!=c[j])
        {
            if(i)  i=0;             //若i不在前缀位置则返回                            
            else   next[++j]=0;    
        }else{    
            next[++j]=++i;       //记录i当前位置,即当前最长前后缀的长度
        }     
	} 
   printf("j:%d len:%d\r\n", j, len);
   i=0;
   while(i<len){        //打印结果
      printf("%d  ", next[i++]);
   }
    
   free(next);

   return 0;
}

得出一下结果

-1  -1  0  1  2  -1  0

分析步骤:

a b a b a c a
 0:   i=0    j=0    c[i]=a c[j]=a     next=-1		//a
 
 1:   i=0    j=1    c[i]=a c[j]=b     next=-1   	//ab
 
 2:   i=0    j=2    c[i]=a c[j]=a     next=0   		//aba
 
 3:   i=1    j=3    c[i]=b c[j]=b     next=1   		//abab
 
 4:   i=2    j=4    c[i]=a c[j]=a     next=2   		//ababa
 
 5:   i=3    j=5    c[i]=b c[j]=c     next=无   	//ababac
 6:   i=0    j=5    c[i]=a c[j]=c     next=-1   	//ababac
 
 7:   i=0    j=6    c[i]=a c[j]=b     next=0 		//ababaca 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂可欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值