KMP简提

KMP是一种复杂度为O(n+m)的字符串匹配算法,最难理解的部分就是Next数组的求解

 

Next数组即为模板串的每个位置对应的 0~i 位置的前缀与后缀中的最大公共部分,依此公共部分来实现模板串的移动匹配,依此大幅度降低了字符串匹配的复杂度。

Next数组的其实就是对模板串相同前缀后缀的一个递归匹配实现。

推荐一个理解Next数组的博客:https://www.cnblogs.com/tangzhengyue/p/4315393.html

附上代码:

 

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int Next[maxn],f[maxn];

void get_Next(string p){
    Next[0]=0;
    for (int i=1,j=0; p[i]; i++){
        while(j>0 && p[j]!=p[i]) j=Next[j-1];
        if(p[i] == p[j]) j++;
        Next[i]=j;
//        printf("%d ",j);
    }
}
int Kmp(string t,string p){
    int ans=0,len=t.length(),l=p.length();
    for (int j=0,i=0; i<len; i++){
        while(j>0 && t[i]!=p[j]) j=Next[j-1];
        if(t[i]==p[j]) j++;
        f[i]=j;
        if(f[i]==l) ans++,j=Next[j-1];
    }
    return ans;
}

 

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct KMP{
    int Next[maxn],f[maxn];
    void get_Next(string p){
        Next[0]=0;
        for (int i=1,j=0; p[i]; i++){
            while(j>0 && p[j]!=p[i]) j=Next[j-1];
            if(p[i] == p[j]) j++;
            Next[i]=j;
        }
    }
    int Kmp(string t,string p){
        int ans=0,len=t.length(),l=p.length();
        for (int j=0,i=0; i<len; i++){
            while(j>0 && t[i]!=p[j]) j=Next[j-1];
            if(t[i]==p[j]) j++;
            f[i]=j;
            if(f[i]==l) ans++,j=Next[j-1];
        }
        return ans;
    }
}kp;

 

posted @ 2018-08-04 19:28  Acerkoo  阅读(157)  评论(0编辑  收藏  举报