速写KMP字符串匹配算法

kmp算法本人很少用到,猛地一写还差点出错。
在c语言的 < string.h>中就有字符串匹配函数的实现,在我目前所使用的范围内strstr()远远足够,对于两者之间的速度,我更倾向于strstr()(对标准库函数的盲目崇拜)。http://bbs.csdn.net/topics/330170343
本来写的全局变量,然后想想并无价值,没办法直接套用,就给改成内部函数了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=105;
void getnext(const char *s,int* &next)
{
    int i=-1,j=0;
    int n=strlen(s);
    next[0]=-1;
    while(j<n&&i<j)
    {
        if(i==-1||s[i]==s[j])
        {
            i++,j++;
            if(s[i]==s[j])
                next[j]=next[i];
            else
                next[j]=i;
        }
        else
            i=next[i];
    }
}
int KMPfind(const char *s1,const char *s,int pos)
{
    int n=strlen(s);
    int l=strlen(s1);
    if(pos>=l||pos<0)
        return 1;
    int *next=new int[n];
    getnext(s,next);
    int i=pos,j=-1;
    while(i<l&&j<n)
    {
        if(j==-1||s1[i]==s[j])
            i++,j++;
        else
            j=next[j];
    }
    delete []next;
    if(j==n)
        return i-n;
    return -1;
}
int main()
{
    char s[maxn];
    char s2[maxn];
    cin>>s>>s2;
    cout<<KMPfind(s2,s)<<endl;
    char *p=strstr(s2,s);//附上strstr的用法,找到返回匹配到的第一个子字符串的头指针,否则返回NULL
    if(p!=NULL)
        cout<<(p-s2)<<endl;
    return 0;
}




    原文作者:KMP算法
    原文地址: https://blog.csdn.net/github_36268455/article/details/62238271
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞