KMP算法及next数组(最大公共前后缀)求解

博客详细介绍了KMP算法的原理,强调在匹配过程中如何利用最长公共前后缀(next数组)避免不必要的回溯,提高效率。通过实例解析next数组的求解过程,帮助读者深入理解这一概念。
摘要由CSDN通过智能技术生成

KMP算法及next数组(最大公共前后缀)求解

2020.12.14理解:
1. KMP算法
网上关于KMP算法讲解较为简单易懂,因此在此只作简述:
在字符串s中匹配字符串t:
S: ABE…AB…ABC…
T: ABE…AB…ABD…
当匹配C和D时,因不匹配,只需右移t字符串,匹配C和E(因为AB是最长公共前后缀,且t移动到中间AB后一位开始匹配,必失败)。证明如下图:
在这里插入图片描述
2. 最长公共前后缀(next数组)
因为网上关于next数组讲解较为难懂,自己梳理了一遍:
求字符串T各个位上的最大公共前后缀:
T:ABFEABGABFEABC
next[i] 表示T前i+1位字符串的最大公共前后缀
在这里插入图片描述

// 求解最大公共前后缀(next数组)
    public int[] next(String s) {
   
        // write code here
        int[] next = new int[s.length()];
        int n = s.length();
        int i = 0, j = 1;
        while (j < n) {
   
            if (s.charAt(i) == s.charAt(j)) {
   
                next[j] = i + 1;
                i++;
                j++;
            }
            else {
   
                if (i == 0) {
   
                // 若已回退到第0位,且仍不匹配
                    next[j] = 0;
                    j++;
                }
                i = next[i - 1]; //不匹配时回退i
            }
        }</
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。next数组KMP算法中的一个重要概念,用于优化匹配过程。next数组求解过程如下: 1. 首先,我们需要定义一个next数组,next[i]表示当P串中第i个字符与S串中某个字符不匹配时,下一次匹配应该从P串的第next[i]个字符开始。 2. 对于P串中的每一个字符P[i],我们需要找到一个最长的相等前缀后缀长度k,使得P[0:k] == P[i-k:i]。这个k就是next[i]的值。 3. 求解next数组的过程可以使用递推的方式,从next开始,依次求解next、next、...、next[n-1]。具体地,我们可以使用两个指针i和j,其中i表示当需要求解的next值的下标,j表示当已经求解出的next值。初始时,i=0,j=-1。 4. 对于i>0的情况,我们需要不断地将j向移动,直到找到一个满足P[j]==P[i-1]的位置。此时,我们就可以根据已经求解出的next[j]的值来求解next[i]的值。具体地,如果P[next[j]]==P[i-1],那么next[i]=next[j]+1;否则,我们需要继续向递归,直到找到一个满足P[next[next[j]]]==P[i-1]的位置,此时next[i]=next[next[j]]+1。 5. 最后,我们得到了整个P串的next数组,可以使用KMP算法进行字符串匹配。 下面是一个Python实现的例子: ```python def get_next(p): n = len(p) next = [0] * n j = -1 for i in range(1, n): while j >= 0 and p[j+1] != p[i]: j = next[j] if p[j+1] == p[i]: j += 1 next[i] = j return next ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值