#include <iostream>
#include <cstring>
int next[3] = {0};
void getNext(const char* p)
{
int front = 1;
int down = 0;
int nCount = 0;
next[0] = -1;
int pl = strlen(p);
while (front < pl)
{
if (p[front] == p[down])
{
nCount++;
next[front] = nCount;
front++;
down++;
}
else
{
down = next[front];
next[front] = 0;
front++;
nCount = 0;
}
}
}
int kmp (const char* t, const char* p)
{
int front = 0;
int down = 0;
while (front < strlen(t) && down < strlen(p))
{
if (t[front] == p[down])
{
front++;
down++;
}
else
{
if (down > 0)
{
down = next[down-1];
}
else
{
//字符串第一个位置如果都不相等,那么模式串就从头开始,主串就向后移动一个位置
down = 0;
front++;
}
}
}
if (down == strlen(p))
{
return front - down;
}
else
{
return -1;
}
}
int main()
{
const char* test = "aaaaaddddddasdfsdf";
const char* pattern = "sdf";
next[strlen(pattern)] = {0};
//得到next数组
getNext(pattern);
//得到index
int index = kmp(test, pattern);
std::cout << "index=" << index << std::endl;
return 0;
}