zoukankan      html  css  js  c++  java
  • 复习KMP

    2017.4.7:

    看了好几遍的kmp,又忘了。。。

    这次的理解:求next数组,求模式串的对称性(前缀和后缀的最大公共长度),next[i]表示模式串mo[1--i]这个子串的前缀和后缀的最大公共长度。


    给这个月凑够20篇博客,手撸以便KMP,也当作温习一下。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    char N[1005],M[1005],lenN,lenM;
    int next[1005];
    
    void getNext()
    {
        int p=0;
        for(int i=2;i<=lenM;i++)
        {
            while(p>0&&M[p+1]!=M[i])
                p=next[p];
            if(M[p+1]==M[i])
                p++;
            next[i]=p;
        }
    }
    
    bool KMP()
    {
        getNext();
        cout<<"*"<<endl;
        int p=0;
        for(int i=1;i<=lenN;i++)
        {
            while(p>0&&M[p+1]!=N[i])
                p=next[p];
            if(M[p+1]==N[i])
                p++;
            if(p==lenM)
                return 1;
        }
        return 0;
    }
    
    int main()
    {
        scanf("%s%s",N+1,M+1);
        lenN=strlen(N+1);
        lenM=strlen(M+1);
        cout<<KMP()<<endl;
        for(int i=1;i<=lenM;i++)
            cout<<next[i]<<" ";
        cout<<endl;
        return 0;
    }
  • 相关阅读:
    javascript概述
    linux系统编程(一)概述
    软件工程
    SQL
    数据结构和算法(一)概述
    cpp标准库
    c语言标准库
    c/c++概述
    编程语言的思考
    GCD学习
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/6479504.html
Copyright © 2011-2022 走看看