KMP

本文深入解析了KMP算法的原理与应用,包括核心代码实现、完整的代码示例及例题解答,以及KMP算法的改进版本。通过具体代码展示如何进行模式匹配,适用于编程竞赛和实际开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/shenyuling/p/10016796.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值