KMP(java)关于next数组的代码分析

kmp算法
首先咱们先求next数组
代码如下

	public int[] kmpnext(String dest){
		int []next=new int[dest.length()];
		next[0]=0;
		for(int i=1,j=0;i<dest.length();i++){
			while(j>0 && dest.charAt(j)!=dest.charAt(i)){
				j=next[j-1];
			}
			if(dest.charAt(i)==dest.charAt(j)){
				j++;
			}
			next[i]=j;
		}
		return next;
	}

可能有点难度,我们来举个例子分析一下这个代码,看看他是怎么运行的。


假设:dest=“acdbcacda”;


根据咱们的写的代码一步一步的来在这里插入图片描述
   因为j现在没有大于0所以不会执行while循环的代码,
   又因为dest.charAt(i)!=dest.charAt(j),j++也没有执行。
   所以直接执行了next[i]=j这行代码
在这里插入图片描述
一直下去,直到dest.charAt(i)==dest.charAt(j)
如下:在这里插入图片描述
j++开始执行了,直到遇到下面这种情况在这里插入图片描述
进入了while循环,一直循环到j=0这个条件或者dest[j]==dest[i]的条件退出

又因为当j=0时,dest[j]==dest[i]成立,所以j++又执行了一次,于是得到下面这个数组
在这里插入图片描述

这个数组就是我们要求的next数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值