数据结构–KMP之求next数组
next数组的作用:当模式串的第j个字符失配时,从模式串的第 next[j]的继续往后匹配
任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后余生 \color{balck}任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后余生 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后余生, n e x t [ 1 ] 都无脑写 0 \color{red}next[1]都无脑写0 next[1]都无脑写0
手算next数组
在不匹配的位置前边,划一根美丽的分界线模式串一步一步往后退,直到分界线之前“能对上”,或模式串完全跨过分界线为止
next[3] = 1
next[5] = 3
n
e
x
t
[
1
]
都无脑写
0
\color{red}next[1]都无脑写0
next[1]都无脑写0
n
e
x
t
[
2
]
都无脑写
1
\color{red}next[2]都无脑写1
next[2]都无脑写1
其他next:在不匹配的位置前,划一根美丽的分界线
模式串一步一步往后退,直到分界线之前“能对上”,或模式串完全跨过分界线为止。此时j指向哪儿,next数组值就是多少
代码实现
代码一:
void Get_Next(SString T)
{
for (int i = 2, j = 0; i <= T.length; i++)
{
while (j && T.ch[i] != T.ch[j + 1])
j = next[j];
if (T.ch[i] == T.ch[j + 1])
j++;
next[i] = j;
}
}
代码二:
void Get_Next(SString T)
{
next[1] = 0;
int i = 1, j = 0;
while (i <= T.length)
{
if (j == 0 || T.ch[i] == T.ch[j])
next[++i] = ++j;
else
j = next[j];
}
}