#include<iostream>
#include<vector>
#include<string>
using namespace std;
void getnext(string arr,int* next)//传输模式串
{
int i, j=0;//i是后缀,j是前缀,j的意义是j前最长相等前缀长度
//j放在前缀的开始是为什么:字符串的前缀有一层递进关系,只有最前的前缀相等,它后缀才能够相等
//
for (i = 1; i < arr.size(); i++)
{
while (j > 0 && arr[i] != arr[j])
{
j = next[j - 1];//kmp算法本质:不相等就找前一个next的下标。
}
if (arr[i] == arr[j])
{
j++;
}
next[i] = j;
}
//老实说这kmp算法求next这一部有种动态规划的味道,其状态的决定有两种1.匹配直接在next上加1,2.不匹配直接回到原先匹配位置并且读取其下标加1(不为首元素)。
}
/*
* 前缀:
* a aa aab aaba aabaa
* 后缀:
* f af aaf baaf abaaf
*
*/
int main()
{
string arr = "aabaabaaf";
string arr1 = "aabaaf";
int next[100];
memset(next, 0, sizeof(int) * 100);
getnext(arr1, next);
//next求出来是01012
return 0;
kmp算法其实就是充分利用自己已经遍历过的内容,暴力的时间复杂度是O(n*m),n为文本串长度,m为模式串长度,kmp算法就是将m的时间复杂度变为动态规划的时间复杂度。