zoukankan      html  css  js  c++  java
  • KMP模式匹配

    看了半天,还是糊里糊涂,先放这,回过头再看

    #include<stdio.h>
    #include<string.h>
    //求解next[]简化版本
    void getnext(char p[],int next[])
    {
        int i=0,j=-1,len=strlen(p);
        next[0]=-1;
        while(i<len){
            if(j==-1||p[i]==p[j]){
                i++;j++;next[i]=j;
            }
            else j=next[j];
        }
    }
    //求解next[]理解版本
    void getnext(char p[],int next[])
    {
        int i=0,j=-1,len=strlen(p);
        next[0]=-1;
        while(i<len)
        {
            if(j==-1)//最长真前缀和最长真后缀的长度为-1,从模式的开始0继续找
            {
                next[i+1]=0;
                i++;j++;
            }
            else if(p[i]==p[j])//已知i+1之前的最长真前缀和真后缀的长度为j
                               //如果p[i]==p[j]那么i+1的长度为j+1
            {
                next[i+1]=j+1;
                i++;j++;
            }
            else j=next[j];//否则,将检查p[next[j]]是否与p[i]相等
        }
    }
    int kmp(char s[],char p[],int next[])
    {
        int i=0,j=0,lens=strlen(s),lenp=strlen(p);
        while(i<lens&&j<lenp)
        {
            if(j==-1||s[i]==p[j])
            {
                i++;
                j++;
            }
            else j=next[j];
        }
        if(j==lenp)return i-lenp;
        else return -1;
    
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    P1495 曹冲养猪
    luoguP4281[AHOI2008]紧急集合 / 聚会
    NOIP1997 代数表达式
    luogu P3709大爷的字符串题
    luoguP3912 素数个数
    POJ 1065 Wooden Sticks
    POJ 1063 Flip and Shift
    POJ 1062 昂贵的聘礼
    POJ 1003 Hangover
    POJ 1001 Exponentiation
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768520.html
Copyright © 2011-2022 走看看