原理
(不同形状代表不同字符)
这里红箭头方向不匹配(匹配就是 j+1 指的地方和 i 比较,如果相同那么 j ++)
当 j 走到 n 就是整段匹配 , 有了 ne后 j+1 不匹配就只需要退一部分了
即 范围 1–ne[j] ==( j-ne[j] ) — j
而不是退到开头
代码就是
for (int i = 1; i <= m; i++)
{
while (j && s[i] != p[j + 1]) j = nt[j];
if(s[i] == p[j + 1])
j++;
if (j == n)
{
cout << i-n << " ";
j = nt[j];
}
}
那么要实现这个就需要短串的ne数组
求法的原理跟上文匹配的原理差不多
举个例子
代码
for (int i = 2,j=0; i <= n; i++) //ne[1]=0 不需要求,故从2开始
{
while (j && p[i] != p[j + 1]) j = nt[j];
if(p[i] == p[j + 1])
j++;
nt[i] = j;
}