KMP真的不容易
KMP思想很简单
KMP的next数组真难理解
其实next数组的形成就是自己和自己进行比对,其主要思想就是KMP自己
代码:
int main()
{
string s = "abaabcabaaba";
vector<int> next(s.size());
next[0] = -1;
//j就是对比的位置
int j = 0;
//i就是s的位置
int i = 1;
while (i < s.size() - 1)
{
//如果s[i]==s[j],也就是说明在s[i+1]之前的i+1个字符里面
//最大的前后缀子串的大小是j+1,这代表着什么呢?代表着如果
//在s[i+1]时候和s[j+1]匹配不成功的时候,就可以把最大子串
//拉到后面来进行匹配计算,因为前后子串是一样的,所以就可以
//不用对比子串了。
if (s[i] == s[j])
{
next[i + 1] = j + 1;
i++;
j++;
}
//如果s[i]!=s[j],那就让j=next[j],因为前面说了,如果不相
//等,因为又是自己对自己的KMP,所以next数组的前面部分已经
//存储了如果匹配失败应该后移多少的信息,所以就可以这么计算,
//但是当j=0的时候,就说明根本就不会有匹配的了,所以如果匹
//配失败,那就只向后移动i就行了。如果匹配成功,那么就把
//next[i+1]=j+1就行了,因为j=0,因为匹配成功,所以j+1=1
//表示有一个已经是最大前后子串了。
else
{
if (j == 0)
{
next[i + 1] = 0;
i++;
}
else
j = next[j];
}
}
for (int k = 0; k < next.size(); k++)
cout << next[k] << ",";
return 0;
}