#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void getNextArray(char* str2,int* next)
{
int len = strlen(str2);
next[0] = -1;
next[1] = 0;
int pos = 2;
int cn = 0;
while(pos < len)
{
if(str2[pos -1] == str2[cn])
{
next[pos++] = ++cn;
}
else if(cn > 0)
{
cn = next[cn];
}
else
next[pos++] = 0;
}
}
int kmp(char* str1,char *str2,int * next)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
int i1 = 0;
int i2 = 0;
getNextArray(str2,next);
while(i1 < len1 && i2 < len2)
{
if(str1[i1] == str2[i2])
{
i1++;
i2++;
}
else if (next[i2] == -1)
{
i1++;
}
else
{
i2 = next[i2];
}
}
return i2 == len2 ? i1 -i2 : -1;
}
int main()
{
char str1[] = "12a12abc12";
char str2[] = "12ab";
int next[strlen(str2)];
cout << kmp(str1,str2,next) << endl;
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容