您的位置:首页 > 其它

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

2016-05-08 13:40 453 查看
下面是代码: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: