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

 

posted @ 2018-11-25 19:19  shenyuli  阅读(216)  评论(0编辑  收藏  举报
Live2D