首页 > 编程语言 > 详细

KMP算法

时间:2020-07-17 15:18:40      阅读:52      评论:0      收藏:0      [点我收藏+]

今天又被科普了一下:kmp——k(kan)m(mao)p(pian)

技术分享图片

其实说实话,这个字符串算法理解起来还是非常的困难的,而且我在网上看到的一些资料都是各说各的,仿佛都很有道理,但是都写得还不够全面,所以学习这一板板块得知识,我是自己看的视频,这里我就推荐几个,大家可以在B站上搜一搜,其实都讲的还是非常的好的,“小甲鱼的数据结构”还有B站搜KMP算法的第一篇。

题目传送门:P3375 【模板】KMP字符串匹配

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[1000100],b[1000100];
int next[1000100];
int main()
{
    scanf("%s%s",a+1,b+1);
    int la=strlen(a+1),lb=strlen(b+1);
    int j=0;
    next[1]=0;
    //先处理出next数组,无非是b和自己匹配,与b和a匹配一样,故代码差不多
    for(int i=2;i<=lb;i++)
    {
        while(j>0 && b[i]!=b[j+1]) j=next[j];//往前翻记录了有相同前缀的j
        if(b[i]==b[j+1]) j++;//i匹配成功了,i继续往后 
        next[i]=j;//更新当前的next数组 
    }
    j=0;
    for(int i=1;i<=la;i++)
    {
    	while(j>0 && a[i]!=b[j+1]) j=next[j];
        if(a[i]==b[j+1]) j++;
        if(j==lb) printf("%d\n",i-lb+1),j=next[j];//虽然成功匹配但是可以把他当作成并没有成功匹配 
    }
    for(int i=1;i<lb;i++)
        printf("%d ",next[i]);
    printf("%d",next[lb]);
    return 0;
}

by njc

KMP算法

原文:https://www.cnblogs.com/mudrobot/p/13329390.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!