next[j]数组定义
- -1, i=-1
- max{k|0<k<i}&&“P1…Pk-1”==“Pi-k+1…Pi-1”
- 0 别的情况
#include <iostream>
#include <string>
using namespace std;
int* getNext(string subS)
{
int* next = new int[subS.length()];
next[0] = -1;
int i = -1, j = 0;
while (j<subS.length())
{
if (i == -1 || subS[i] == subS[j])
{
next[++j] = ++i;
}
else
{
i = next[i];
}
}
return next;
}
int index_KMP(string mainS, string subS, int* next)
{
int i = 0,j = 0;
while (i<mainS.length()&&j<(int)subS.length())
{
if (j==-1||mainS[i] == subS[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j >= (int)subS.length())
return i - subS.length();
else
return -1;
}
int main()
{
string s = "main";
string s1 = "sub";
int* next = getNext(s1);
cout << index_KMP(s, s1, next);
}