KMP算法之next数组

本文探讨了KMP算法中的核心——next数组的构造和意义。next数组记录了字符串匹配过程中的最大相同前后缀长度,用于减少不必要的字符比较。当失配发生时,next数组能指示如何有效地回溯,提高匹配效率。通过一个简单的Java代码示例展示了next数组的生成过程,解释了其在避免暴力匹配(BF算法)退化情况下的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。

      这个next数组的求法是KMP算法的关键,能不能掌握它非常的重要。

个人总结:

next【i】是最大相同前后缀的长度,回溯之后i=next【i】, 即新的j指向了前缀 (ab)的后面一个char(c),滑动距离就是i-next【i】,next【i】越小,滑动距离越大,next【i】越大,滑动距离越小。然后就是next【0】设计成-1的精妙之处就是公共部分是i++,j++,如果第一个char就失配,KMP退化成BF,即i=i-j+1,j=0。第一次i++和j++就失配了,失配了去找next【j】嘛,然后j = j-next【0】,next【0】是-1即可。next表的意义就是,j++的时候,如果每次都要向前扫描找是否有相同前后缀并记录长度,这就很难受,因为可以在任意一个时刻失配。

package com.southwind;

public class next_Array {
    public static void main(String[] args) {
        String str = "abcdabd";
        int next[] = new int[8];
        getNext(str, next);
        for (int a : next)
            System.out.print(a + " ");
    }

    public static void getNext(String s, int next[]) {
        int i = -1;   //i前缀
        int j = 0;    //j后缀
        next[0] = -1;
        char a[] = s.toCharArray();
        while (j < a.length) {
            if (i == -1 || a[i] == a[j]) {
                i++;
                j++;
                next[j] = i;
            } else
                i = next[i];
        }
    }


}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值