kmp

#include <iostream>
using namespace std;
int nextr[100];
int main()
{
    char str[100];
    char ptr[100];
}
void kmp(char *str,int n)
{
    nextr[0]=-1;
    int k;
    k=0;
    for(int i=1;i<n;++i)
    {
        while(k>-1 && str[k+1] != str[i])
            k = nextr[k];
        if(str[k+1] == str[i])
            k=k+1;
        nextr[i]=k;
    }
}
int kmp2(char *str, char *ptr)
{
    int len1=strlen(str);
    int len2=strlen(ptr);
    int k = -1;
    for(int i=0;i<len2;++i)
    {
        while(k>-1 && str[k+1] != ptr[i])
            k=nextr[k];
        if(ptr[i] == str[k+1])
            k = k+1;
        if(k == len2-1)
        {
            return i-len1+1;
        }
    }
    return -1;
}
原文地址:https://www.cnblogs.com/mltang/p/8846699.html