//#include "stdafx.h"
#include<iostream>
#include<string>
#include <vector>
using namespace std;
int kmp_find(const string& target,const string& pattern)
{
const int target_length=target.size();
const int pattern_length=pattern.size();
int* overlay_value=new int[pattern_length];
overlay_value[0]=-1; //remember:next array‘s first number was -1.
int index=0;
//next array
for (int i=1;i<pattern_length;++i)
//×¢£?′?′|μ?iê?′ó1?aê?μ?
{
index=overlay_value[i-1];
while (index>=0 && pattern[index+1]!=pattern[i])
{
index=overlay_value[index];
}
if(pattern[index+1] == pattern[i])
{
overlay_value[i]=index+1;
}
else
{
overlay_value[i]=-1;
}
}
//mach algorithm start
int pattern_index=0;
int target_index=0;
while (pattern_index<pattern_length && target_index<target_length)
{
if (target[target_index] == pattern[pattern_index])
{
++target_index;
++pattern_index;
}
else if(pattern_index==0)
{
++target_index;
}
else
{
pattern_index=overlay_value[pattern_index-1]+1;
}
}
if (pattern_index==pattern_length)
{
return target_index-pattern_index;
}
else
{
return -1;
}
delete [] overlay_value;
}
int main()
{
string sourc="abcabaaabaabcac";
string pattern="abaabcac";
cout<<kmp_find(sourc,pattern)<<endl;
system("pause");
return 0;
}
原文:http://my.oschina.net/u/1454298/blog/365634