i do not speak the algorithm principle, you can get this knowledge in my blog.
/*************************************************************************
> File Name: Boyer_Moore.cpp
> Author: ryq
> Email: ranyongqing@163.com
> Created Time: 2014年05月22日 星期四 19时30分56秒
************************************************************************/
#include<iostream>
#include<string>
#include<utility>
using namespace std;
pair<string,int> Boyer_Moore(string &src, string &des)
{
int size = src.size();
int len = des.size();
string str;
if(len > size)
return make_pair(str,-1);
int i,j;
i = j = len-1;
int k = 0;// record the number of good chars;
for(; i < size && j >= 0;){
if(src[i] == des[j]){
i--;
j--;
k++;
}
else{
if(k == 0){
size_t found = des.find_last_of(src[i]);
if(found == string::npos)
i += len-1;
else
i += len -1 - found;
}
else{
size_t found = des.find_first_of(src[i+k]);
if(found == len-1){
i = i + k + len -1;
j = len - 1;
}
else{
i = i + len - found - 1;
j = len - 1;
}
k = 0;
}
}
}
if(j < 0)
return make_pair(des,i+1);
else
return make_pair(str,-1);
}
int main()
{
pair<string,int>res;
string src = "BBCABCDABD ABCDABCDABE";
string des = "BCDABE";
res = Boyer_Moore(src,des);
cout<<res.first<<" "<<res.second<<endl;
}