KMP算法的next数组中k=next[k-1]的理解以及例子

首先这是next数组的代码:

 public static  int[] kmpNext(String dest){
        //创建一个数组存储部分匹配值
        int[] next = new int[dest.length()];
        next[0] = 0;//如果字符串长度是1部分匹配值就是0
        for (int i = 1,j = 0; i < dest.length(); i++) {
            while (j > 0 && dest.charAt(i) != dest.charAt(j)){
                j = next[j-1];
                //j=0;
            }
            if (dest.charAt(i) == dest.charAt(j)){
                j++;
            }
            next[i] = j;
        }
        return next;
    }

这里我用的0表示next数组中没有匹配的元素,与用-1一样,所以我这里需要用的j = next[j-1]需要减1.接下来我举一个例子:
index: 0 1 2 3 4 5 6
next : A B A A B A B
value: 0 0 1 1 2 3 2

当求到最后一个元素比较的时候 我这里也就是 i = 6(右边的最后元素) j = 3(左边的最后元素)比较
dest[6] != dest[3]

在这里我们可以看到 j-1代表左边最后元素A的左边一个元素A
while (j > 0 && dest.charAt(i) != dest.charAt(j))由进入判断的J>0 表示最后一次比较之前有相同的元素
由于dest[6] != dest[3]
最后一个元素不同,但是前面一个元素是相同的,所以你需要往前面找看有没有可能和右边最后元素匹配的(类似于KMP思想中字符匹配时没找到完全匹配往后跳跃找与首字符相同的位置一样)也就是j = next[j-1],但是还怎么找呢,还需根据next数组的值,next[j-1]->next[2] = 1表示这个A和前面还有有匹配的字符,
所以再用右边的最后元素和定位的dest[1]进行比较,
发现匹配就J++;这里的J还有值1,所以J=2 ->next[6] = 2

如果发现不匹配就继续上面的步骤找这个元素前面的一个元素 看他的next值是否为0,不为0就同上面的思想继续向前跳跃找匹配的元素,为0就表示没有匹配的了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值