next[i]数组的含义:
若next[i]=j 则表示为下标为i的字符其最长前后缀为j,并且规定next[1]=0;
匹配的过程:
假设s[ ]为模板串 (较长) p[ ]为模式串(较短),当s[i]!=p[j+1]时,也就是j+1之后不配对但1~j时符合,此时挪动模式串至next[j],因为
此时j的next[j]保存的是以j结尾的前后缀长度,所以只需要将模板串从next[j]开始匹配即可。
求next[ ]模板
for (int i = 2, j = 0; i <= n; i ++ )
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++ ;
ne[i] = j;
}
匹配模板
for (int i = 1, j = 0; i <= m; i ++ )
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++ ;
if (j == n)
{
匹配完成
}
}
关于next[]数组的理解的题
寻找字符串
关于kmp的另一种写法(STL)
string a,b; //a为长串,b为短串
//让a的下标从1开始只需
cin>>a; a=' '+a;
//在a中寻找b
假设a的长度为n,b的长度为m
for(int i=m;i<=n;i++)
{
if(a.substr(i-m+1,m)==b)
puts("已寻找到b");
}