KMP算法

解决问题:用于求解一个串是否在另一个串中出现以及出现了多少次?

时间复杂度:O(n+m)            空间复杂度:O(m)


算法:

1、next[ ]数组的求解

2、根据next[ ]数组进行匹配


KMP算法next[ ]数组求解:

1、next[ ]数组保存部分匹配值,用于字符串分析,不用于kmp算法的求解

void Pre_kmp(char x[],int m,int next[]){///原始next数组:部分匹配值
    int j=next[0]=0;
    for(int i=1;i<m;++i)
    {
        while(0!=j && x[i]!=x[j])
            j = next[j-1];
        if (x[i]==x[j])
            j++;
        next[i] = j;
    }
}
2、next[ ]数组一般求解方法

void Pre_kmp(char x[],int m,int next[]){
    int j=next[0]=-1;
    int i=0;
    while(i<m){
        if(-1!=j&&x[i]!=x[j]) j=next[j];
        next[++i]=next[++j];
    }

}
3、针对aaaaaaaaaaaaaab这样的模板串进行优化的next[ ]数组方法

void Pre_kmp(char x[],int m,int next[]){///优化后
    int j=next[0]=-1;
    int i=0;
    while(i<m){
        while(j!=-1&&x[i]!=x[j]) j=next[j];
        if(x[++i]==x[++j]) next[i]=next[j];///优化处理
        else next[i]=j;
    }
}


KMP算法标准模板:

#include <iostream>
#define MAXN 10010
using namespace std;

void Pre_kmp(char x[],int m,int kmpNext[]){
    int i,j;
    j=kmpNext[0]=-1;
    i=0;
    while(i<m){
        while(-1!=j&&x[i]!=x[j]) j=kmpNext[j];
        if(x[++i]==x[++j]) kmpNext[i]=kmpNext[j];
        else kmpNext[i]=j;
    }
}

int next[MAXN];
int KMP_Count(char x[],int m,char y[],int n){
    //x是模式串,y是主串
    int ans=0;
    Pre_kmp(x,m,next);///预处理得到模式串x的next数组

    int i,j;
    i=j=0;
    while(i<n){
        while(j!=-1 && y[i]!=x[j]) j=next[j];///j==-1表示第一个字符x[0]与y[i]不匹配
        i++;j++;
        if(j>=m){
            ans++;
            j=next[j];
        }
    }
    return ans;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值