我的kmp笔记

在str中找ttr第一次出现的位置,没找到就是-1,

bf算法暴力匹配

int BF(char s[], char p[])
{
    int m, n,i,j;
    m = strlen(s);
    n = strlen(p);
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
        {
            if(s[i + j] != p[j])
                break;
            if( j == n - 1)
            {
                return i;
            }
        }
    }
    return -1;
}

kmp算法FJUTACM2149
#include<stdio.h>
#include<string.h>
char s1[1000005],s2[1000005];
int next[1000005];
void get_next(char s[])///求next数组
{
    int i=0,j=-1;
    next[0]=-1;     ///虽然while第一次填next[0]=-1,但是去掉会死循环
    int len=strlen(s);
    while(i<len)
    {
        if(j==-1||s[i]==s[j])
        {
            i++;
            j++;
            ///特例优化 aaaaab 匹配aaaaax时b-x匹配失败,回溯
            if(s[i]!=s[j])
            {
                next[i]=j;
            }
            else
            {
                next[i]=next[j];
            }
        }
        else
        {
            j=next[j];
        }
    }
}
int kmp(char *str,char *ttr)
{
    int i=0,j=0;
    int len1=strlen(str),len2=strlen(ttr);///strlen返回值unsigned放在while会出错
    while(i<len1&&j<len2)
    {
        if(j==-1||str[i]==ttr[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];
        }
    }
    if(j==len2)///succeed
    {
        return i-j;
    }
    else///failed
        return -1;
}
int main()
{
    while(~scanf("%s%s",s1,s2))
    {
        memset(next,0,sizeof(next));
        get_next(s2);
        printf("%d\n",kmp(s1,s2));
    }
    return 0;
}


全部评论

相关推荐

05-03 12:45
西南大学 Java
sdgfdv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
03-21 08:46
已编辑
门头沟学院 C++
一个什么都不会的学生:当你有硕士学历的时候HR会说就是比本科生强
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务