zoukankan      html  css  js  c++  java
  • 串 朴素算法跟 KMP 算法

    //  http://www.cnblogs.com/c-cloud/p/3224788.html
    #include <iostream>
    #include <cstring>
    using namespace std;
    void makeNext(const char* dest, int next[])
    {
        int m =strlen(dest);
        int p,k;
        next[0]=0;
        for(p=1,k=0; p<m; p++)
        {
            while(k>0 && dest[p] != dest[k])
            {
                k= next[k-1];
            }
            if(dest[p]==dest[k])
            {
                k++;
            }
            next[p]=k;
        }
    }
    int  MyKMP(const char* dest, const char* src, int next[])
    {//从第一位开始计数
        makeNext(src, next);
        int  lenSrc=strlen(src);
        int lenDest = strlen(dest);
        for(int i=0, q=0; i<lenDest;i++)
        {
            while(q>0 && src[i]!=dest[q])
            {
                q=next[q-1];
            }
            if(src[i]==dest[q])
            {
                q++;
            }
            if(lenSrc == q)
            {
                cout<<"the position is:"<<(i-lenSrc+1)<<endl;
            }
        }
    }
    int stupidKMP(const char *dest, const char* src)
    { //从第零位开始计数
        int i=0;
        int j=0;
        while(dest[i+j]&&src[j])
        {
            if(dest[i+j]==src[j])
            {
                j++;
            }
            else
            {
                i++;
                j=0;
            }
        }
        if(src[j]=='')
        {
            return i;
        }
        else
        {
            return -1;
        }
    }
    int main()
    {
        int i;
        char dest[] = "BBC ABCDAB ABCDABCDABDE";
        char src[] = "ABCDABD";
        int size = strlen(src);
        int next[15]={0};
        cout<<dest<<endl;
        cout<<src<<endl;
        cout<<stupidKMP(dest,src)+1<<endl; //stupid KMP
        MyKMP(dest,src,next); //KMP
        for (i = 0; i < strlen(src); ++i)
        {
            cout<<next[i];
        }
        cout<<endl;
        return 0;
    }
    关注公众号 海量干货等你
  • 相关阅读:
    如何在Linux下的C++文件使用GDB调试
    21天学通C++(C++程序的组成部分)
    嵌入式Linux应用程序开发
    项目部署的问题
    未解决
    报错
    随笔
    逆向工程出现的错误1
    jpa学习
    springmvc整合mybaits
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734515.html
Copyright © 2011-2022 走看看