zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10016796.html
Copyright © 2011-2022 走看看