码迷,mamicode.com
首页 > 其他好文 > 详细

KMP相关

时间:2017-10-29 17:41:02      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:老师   new   https   lap   else   blank   分享   文本   字符串匹配   

KMP是一个困扰我很久的算法,听老师或者是学姐讲了差不多有4次了,但是还是搞不太懂,今天终于,终于,终于搞懂了!

                          ——2017-10-29 Vanora

首先推荐一下KMP详解——July

读罢之后内心只有一个感觉:我的KMP终于可以毕业了qwq

学东西千万不要求快!细细地,慢慢地去读这篇文章,相信你也可以从头到尾彻底理解KMP算法呦~

接下来是一些KMP的练手题:

做完这些并且真正搞懂之后,相信你一定就会KMP算法了~(一定要理解了,吃透了!)

1.P3375 【模板】KMP字符串匹配

直通车

思路:

  真正意义上的KMP板子题,很良心

坑点:

  一定要真正理解nxt[]求得到底是什么,是用匹配串求解还是用文本串

上代码:

技术分享
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int M = 1000011;
char s[M],p[M];
int lens,lenp;

int nxt[M];
void getnxt() {
    int k=-1,j=0;
    nxt[0]=-1;
    while(j<lenp) {
        if(k==-1 || p[j]==p[k]) {
            j++;k++;
            nxt[j]=k; //记录更新的nxt值 
        }
        else k=nxt[k];
    }
}

void KMP() {
    int i=0,j=0;
    while(i<lens) {
        if(j==-1 || s[i]==p[j]) i++,j++; 
        //j==-1:没有nxt,所以从一开始进行匹配 
        //s[i]==p[j]:当前文本串与匹配串的位置上的字符匹配成功,继续匹配 
        else j=nxt[j]; //寻找更短的公共前后缀 
        if(j==lenp) {
            printf("%d\n",i-lenp+1);
            i--; //文本串之前已经匹配过了,所以没有再次进行匹配的需要了 
            j=0; //匹配串从新开始进行匹配 
        }
    }
} 

int main() {
    cin>>s>>p;
    lens=strlen(s);
    lenp=strlen(p);
    getnxt();
    KMP();
    for(int i=1; i<=lenp; i++) printf("%d ",nxt[i]);
    return 0;
}
View Code

 

KMP相关

标签:老师   new   https   lap   else   blank   分享   文本   字符串匹配   

原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7750431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!