KMP算法模板

模板一

int kmp(const string &T, const string &P)
{
    if (P.empty()) return 0;

    vector<int> pi(P.size(), 0);
    for (int i = 1, k = 0; i < P.size(); ++i)
    {
        while (k && P[k] != P[i]) k = pi[k - 1];
        if (P[k] == P[i]) ++k;
        pi[i] = k;
    }

    for (int i = 0, k = 0; i < T.size(); ++i)
    {
        while (k && P[k] != T[i]) k = pi[k - 1];
        if (P[k] == T[i]) ++k;
        if (k == P.size()) return i - k + 1;
    }

    return -1;
}




模板二

#include <bits/stdc++.h>
using namespace std;

void prefix_table(char pattern[],int prefix[])
{
    prefix[0]=0;
    int len = 0;
    int i = 1;
    int n = strlen(pattern);
    while(i < n)
    {
        if(pattern[i] == pattern[len])
        {
            len++;
            prefix[i] = len;
            i++;
        }
        else
        {
            if(len > 0)
                len = prefix[len - 1];
            else
            {
                prefix[i] = len; /// pattern[i] = 0;
                i++;
            }
        }
    }
}

void Move_prefix_table(int prefix[],int m)
{
    for(int i = m - 1; i >= 1; i--)
        prefix[i] = prefix[i - 1];
    prefix[0] = -1;
}

void KMP_Search(char text[],char pattern[])
{
    int i=0,j=0;
    int n = strlen(text);
    int m = strlen(pattern);
    int* prefix = (int *) malloc(sizeof(int) * m);
    prefix_table(pattern,prefix);
    Move_prefix_table(prefix,m);
    while(i < n)
    {
        if(j == m-1 && pattern[j] == text[i])
        {
            printf("Found pattern at %d\n",i - j + 1);
            j = prefix[j];
        }
        if(j == -1 || pattern[j] == text[i])
        {
            j++;
            i++;
        }
        else
        {
            j = prefix[j];
        }
    }
}

int main()
{
    char text[] = "abcabcaaaabcaaaabc";
    char pattern[] = "abcaaaa";
    KMP_Search(text,pattern);
    return 0;
}



模板三

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;

vector<int> Get_next(string &P)
{
    int k = -1, j = 0;
    vector<int> next(P.length(),0);
    next[0] = -1;
    while(j < P.length() - 1)
    {
        if(k == -1 || P[j] == P[k])
            next[++j] = ++k;
        else
            k = next[k];
    }
    return next;
}

vector<int> KMP(string &T,string &P)
{
    int k = 0, i = 0;
    vector<int> EveryFirstIndex;
    vector<int> next = Get_next(P);

    while(i < T.length() && k < P.length())
    {
        if(k == P.length() - 1 && T[i] == P[k])
        {
            EveryFirstIndex.push_back(i - k);
            k = next[k];
            continue;
        }
        if(k == -1 || T[i] == P[k])
        {
            i++;
            k++;
        }
        else
            k = next[k];
    }
    return EveryFirstIndex;
}

int main()
{
    string T = "aaaaaaaas";
    string P = "aaaaas";
    vector<int> EveryFirstIndex = KMP(T, P);
    cout<<EveryFirstIndex.size()<<endl;
    for(int i = 0; i < EveryFirstIndex.size(); i++)
        cout<<EveryFirstIndex[i]<<" ";
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值