U2yyy 2022-08-14 21:00 采纳率: 71.4%
浏览 97
已结题

为什么KMP匹配算法的next[1]为0

今天学习KMP匹配算法时,注意到next[j]当j=1时似乎要取0,为什么是这样呢?

KMP匹配算法里面的next[ ]不是用来统计到目前为止有多少个公共前后缀吗,在《大话数据结构》以及我查阅的很多资料中,像模式字符串abcabx,它的next[ ]应当是 011123,这是我不太能理解的。我认为next[] 应该是 000120,而且我用这样的next[ ]似乎实现了同样的功能,即避免i值回溯,以实现时间复杂度为O(m+n)。

我想知道我的实现方法是否可行,然后我还想知道书上和一些资料里面的next[ ]到底是怎么来的,它对我来说似乎过于抽象了,我理解不了。

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

void getNext(int* next,char pattern[],int length);
int KMP_search(char *s,char *p,int pos,int p_length,int s_length);

int main()
{
    char p[] = "abcabx";
    char s[] = "babcabxss";
/*     int l = sizeof(p)/sizeof(p[0]) - 1;
    int next[l];
    getNext(next,p,l);
    for(int i =0;i<l;i++)
    {
        printf("%d ",next[i]);
    } */
    int p_length = sizeof(p)/sizeof(p[0])-1;
    int s_length = sizeof(s)/sizeof(s[0])-1;
    int pos = KMP_search(s,p,0,p_length,s_length);
    printf("%d ",pos);
    system("pause");
}

void getNext(int* next,char pattern[],int length)
{
    next[0] = 0;
    int i = 0,j = 1;
    while(j<length)
    {
        if(pattern[j] == pattern[i])
        {   
            next[j] = i+1;
            j++;
            i++;
        }
        else if(i == 0)
        {
            next[j] = i;
            j++;
        }
        else
        {
            i = next[i];
        }
    }
}

int KMP_search(char *s,char *p,int pos,int p_length,int s_length)
{
    int i = pos;
    int j = 0;
    int next[256];
    getNext(next,p,p_length);
    while(i<s_length&&j<p_length)
    {
        if(s[i] == p[j])
        {
            i++;
            j++;
        }
        else if(j == 0)
        {
            i++;
        }
        else
        {
            j = next[j];
        }
    }
    if(j == p_length)
    {
        return i-j;
    }
    else
    {
        return -1;
    }
}

  • 写回答

4条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-08-15 08:40
    关注

    next 数组考虑的是除当前字符外的最长相同前缀后缀,因为除了当前字符外,1前面只有一个字符,不可能会出现公共前缀的,所以next(1)是0

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 赞助了问题酬金10元 8月14日
  • 修改了问题 8月14日
  • 展开全部

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题