• KMP


    1.核心代码

    class Kmp
    {
        public :
        string s;
        string t;
        int next[maxn];
        void get_next()
        {
            int i=-1,j=0,lent=t.size();
            next[j]=-1;
            while(j<lent-1)
            {
                if(i==-1||t[i]==t[j])
                    next[++j]=++i;
                else
                    i=next[i];  
            }
        }
        int kmp()
        {
            int i=0,j=0,lens=s.length(),lent=t.size();
            get_next();
            while(i<lens&&j<lent)
            {
                if(j==-1||t[j]==s[i])
                {
                    i++;
                    j++;
                }
                else
                   j=next[j];
            }
            if(j==lent)
               return i-j+1;
            else 
               return 0;
        }
    };
    View Code

    2.完整代码+例题

       a.地址:http://tk.hustoj.com/problem.php?id=1746

       b.代码

    #include<iostream>
    #include<string>
    using namespace std;
    const int maxn=100;
    class Kmp
    {
        public :
        string s;
        string t;
        int next[maxn];
        void get_next()
        {
            int i=-1,j=0,lent=t.size();
            next[j]=-1;
            while(j<lent-1)
            {
                if(i==-1||t[i]==t[j])
                    next[++j]=++i;
                else
                    i=next[i];  
            }
        }
        int kmp()
        {
            int i=0,j=0,lens=s.length(),lent=t.size();/*请注意这不是多余的,这不是多余的,这不是多余的*/
            get_next();
            while(i<lens&&j<lent)//直接用j<t.size()会出现-1<t.size()为false情况
            {
                if(j==-1||t[j]==s[i])
                {
                    i++;
                    j++;
                }
                else
                   j=next[j];
            }
            if(j==lent)
               return i-j+1;
            else 
               return 0;
        }
    };
    int main()
    {
        Kmp a;
        while(cin>>a.s>>a.t)
            cout<<a.kmp()<<endl;
        return 0;
    }
    View Code

     3.KMP改进算法

    #include<iostream>
    #include<string>
    using namespace std;
    class String
    {
        string s;
        string t;
        public:
            void get_nextval(int nextval[])
            {
                int k=-1;
                int j=0;
                nextval[0]=-1;
                while(j<(int)t.size())
                {
                    if(k==-1||t[k]==t[j])
                    {
                        k++;
                        j++;
                        if(t[k]!=t[j])
                           nextval[j]=k;
                        else
                           nextval[j]=nextval[k];
                    }
                    else
                        k=nextval[k];
                }
            }
            int kmp_indexl()//改进KMP
            {
                int *nextval=new int[(int)t.size()+1];
                get_nextval(nextval);
                int i=0,j=0;
                while(i<(int)s.size()&&j<(int)t.size())
                {
                    if(j==-1||s[i]==t[j])
                    {
                        i++;
                        j++;
                    }
                    else
                        j=nextval[j];
                }
                delete []nextval;
                if(j>=(int)t.size())
                   return i-t.size()+1;
                else
                   return 0;
            }
            friend int main();
     } ;
    int main()
    {
        String a;
        while(cin>>a.s>>a.t)
            cout<<a.kmp_indexl()<<endl;
        return 0;
    } 
    View Code
  • 相关阅读:
    买不起笔记本,只好自己动手做一个啦!(转)
    Microsoft.Press.Microsoft.Visual.C.Sharp.2005.Step.by.Step.Oct.2005
    将指定网页添加到收藏夹的方法(c#)
    一个任意获得页面控件的方法
    取客户端MAC地址的方法
    关于在活动目录(ACTIVE DIRECTORY)中创建组织单位和用户
    无 Cookie 的 ASP.NET
    吉祥三宝(设计篇)
    C语言第一次实验报告
    C语言第二次实验作业
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10016796.html
Copyright © 2020-2023  润新知