<pre name="code" class="cpp">#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
void get_next(vector<int>& next,const char* subStr)
{
int length=next.size();
next[0]=-1; //next[0] = -1
int i=0,j=-1;
while(i<length-1) //i<length-1,为循环限制条件
{
if(j==-1 || subStr[i]==subStr[j])
{
next[++i] = ++j;
}
else
j = next[j]; //数组适当进行回退
}
}
int kmpMatch(const char* str,const char* substr)
{
int lengthS=strlen(str);
int length=strlen(substr);
vector<int> next(length,0);
get_next(next,substr);
int i=0;
int j=0;
while(i<lengthS && j<length)
{
if(j==-1 || str[i]==substr[j])//j==-1也是就回退到了子串的开头位置,则i,j都向前一步
{ //假设主串和子串匹配,也须要向前一步
i++;
j++;
}
else
{
j=next[j];//假设未能匹配则回退到下一位置
}
}
if(j==length)//已经查找到子串的末尾
return i-length;
else
return 0;
}
int main()
{
const char* str="abcababcabcabx";
const char* subStr="abcabx";
cout<<kmpMatch(str,subStr)<<endl;
return 0;
}