KMP算法入门【详解+例题模板】

转载请注明出处:http://blog.csdn.net/a1dark

KMP算法的来由就不说了、就个人的理解其实就是预处理要匹配的那个字符串、根据自己身的重复性来找规律节约遍历的时间、说术语就是寻找字符串前缀和后缀相同的最长的长度、当然本身除外、举个例就是“acbacd”、比如这个字符串匹配到最后一个字符错了、于是我看它前面的几个字符特点很明显我们不用重新从头开始比、而可以从字符“b”开始比、因为“acbac”的前缀“ac”==后缀“ac”、相当于间接的比过了、我觉得这个比较好理解吧、虽然这个思想确实比较容易理解、但是想要轻松自己把这个求模式函数next值想出来可不容易、思想理解了、实现就看个人了。。。

下面上几道例题、增强一下、

首先一道赤裸裸的KMP

以前写过:【HDU 1711】

http://blog.csdn.net/a1dark/article/details/12247471

接下来关于next值的一些小应用:

【POJ 2406】

#include<stdio.h>
#include<string.h>
char str[1000001];
int next[1000001];
int getnext(){
    int j=0,k=-1;
    next[0]=-1;
    int len=strlen(str);
    while(j<len){
        if(k==-1||str[j]==str[k]){
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
    int s=len-k;
    if(len%s==0){
        return len/s;
    }
    return 1;
}
int main(){
    while(gets(str)){
        if(str[0]=='.')break;
        printf("%d\n",getnext());
    }
    return 0;
}

POJ 1961】

#include<stdio.h>
#include<string.h>
int next[1000001];
char str[1000001];
int n;
void getnext(){
    int j=0,k=-1;
    next[0]=-1;
    while(j<n){
        if(k==-1||str[j]==str[k]){
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
}
int main(){
    int cas=1;
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        scanf("%s",str);
        getnext();
        printf("Test case #%d\n",cas++);
        for(int i=1;i<=n;i++){
            int len=i-next[i];
            if(next[i]>0&&i%len==0){
                printf("%d %d\n",i,i/len);
            }
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N诺计算机考研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值