标签:
下面是代码: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; }
标签:
原文地址:http://blog.csdn.net/wr_technology/article/details/51345353