KMP算法

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
using namespace std;
 
void makeNext(char s[],int next[])
{
    int len = strlen(s);
    next[0]=0;
    for(int i=1,k=0;i<len;i++)
    {
        while(k>0 && s[k]!=s[i])
            k=next[k-1];
        if(s[k]==s[i])
            k++;
        next[i]=k;
    }
}
 
int kmp(char t[],char s[])
{
    int len1 = strlen(t);
    int len2 = strlen(s);
    int next[len2];
    makeNext(s,next);
    for(int i=0,j=0;i<len1;i++)
    {
        while(j>0 && t[i]!=s[j])
        {
            j=next[j-1];
        }
        if(t[i]==s[j])
            j++;
        if(j==len2)
            return i-j+1;
    }
}
 
int main()
{
    char t[]="1234561123458412";
    char s[]="611";
    cout<<t<<endl;
    cout<<s<<endl;
    cout<<"下标为"<<kmp(t,s)<<endl;
}

  

————————————————
版权声明:本文为CSDN博主「ExcesiveYue」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yutong5818/article/details/81319120

原文地址:https://www.cnblogs.com/Cnxz/p/12456320.html