BM算法模式匹配——字符串与KMP比较

下面是代码:BM是什么参考阮一峰老师的讲解  点击打开链接

#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include <time.h>
#include<windows.h>
using namespace std;
const int MAX_SIZE=5005;


void set_ASC(int *ASC,int len,string& b,int& last)
{
    int i;
    for(i=0; i<len; i++)
    {
        ASC[ (int)b[i]]=i;
        if(b[i]==b[len-1]&&i!=len-1) last=i;
    }
}
int bm(string &a,string& b)
{
    int ASC[260],lena=a.size(),lenb=b.size();
    int i=lenb-1,j=lenb-1;
    int last=-1;
    memset(ASC,-1,sizeof(ASC));
    set_ASC(ASC,lenb,b,last);
    while(i<lena&&j<lenb)
    {
        int ii,jj;
        ii=i,jj=j;
        while(1)
        {
            if(a[ii]==b[jj])
            {
                if(jj==0) return ii+1;
                ii--,jj--;
            }
            else
            {
                if(jj!=lenb-1) i+=max((jj-ASC[(int)a[ii]]),lenb-1-last);
                else i+=(jj-ASC[(int)a[ii]]);
                j=lenb-1;
                break;
            }
        }
    }
    return -1;
}
void set_kmp_next(int *kmp_next,int len,string& b)
{
    int i=0,j=-1;
    kmp_next[0]=-1;
    while(i<len)
    {
        if(j==-1||b[i]==b[j])
        {
            i++;
            j++;
            kmp_next[i]=j;
        }
        else
            j=kmp_next[j];
    }
}
int kmp(string &a,string& b)  // a 为原串  ,b 为模式串
{
    int i,j,lena=a.size(),lenb=b.size();
    int kmp_next[MAX_SIZE];
    set_kmp_next(kmp_next,lenb,b);
    i=j=0;
    while(i<lena)
    {
        if(j==-1||a[i]==b[j])
        {
            i++;
            j++;
        }
        else
            j=kmp_next[j];
        if(j==lenb)
            return i-j+1;
    }
    return -1;
}
int main()
{
//    freopen("stdin.txt","r",stdin);
//    freopen("stdout.txt","w",stdout);
    string a,b;
    while(cin>>a>>b)
    {
        printf("%d\n",bm(a,b));
        printf("%d\n",kmp(a,b));
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(BM算法模式匹配——字符串与KMP比较)