如何计算next数组请给出方法并举个例子
时间: 2024-05-19 13:12:06 浏览: 71
数据结构KMP-NEXT数组计算方法
5星 · 资源好评率100%
计算 next 数组是 KMP 算法的重要步骤,用于优化模式串的匹配过程。下面是计算 next 数组的方法:
1. 首先需要初始化 next 数组,将第一个元素赋值为 -1。
2. 从第二个元素开始遍历模式串,依次计算每个位置的 next 值。
3. 对于第 i 个位置,假设其前面已经计算出了前缀子串的 next 值,即 next[0] 到 next[i-1],则需要判断下一个字符是否与前缀的下一个字符相同。
4. 如果相同,则将 next[i] 赋值为前缀的 next 值加 1。
5. 如果不同,则需要回溯到前缀的 next 值所指向的位置,再次比较下一个字符是否相同,直到回溯到 -1 或者找到相同字符为止。
6. 重复以上步骤,直到计算出整个模式串的 next 数组为止。
下面举个例子,假设我们要计算模式串 P = "abababc" 的 next 数组。
1. 首先初始化 next 数组,将第一个元素赋值为 -1。
2. 从第二个元素开始遍历模式串,依次计算每个位置的 next 值。
- 对于 i = 1,前缀子串为空,因此 next[1] = 0。
- 对于 i = 2,前缀子串为 "a",下一个字符为 "b",不相同,因此 next[2] = 0。
- 对于 i = 3,前缀子串为 "ab",下一个字符为 "a",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[1],此时前缀子串为 "a",下一个字符为 "b",相同,因此 next[3] = 1。
- 对于 i = 4,前缀子串为 "aba",下一个字符为 "b",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[1],此时前缀子串为 "a",下一个字符为 "b",相同,因此 next[4] = 2。
- 对于 i = 5,前缀子串为 "abab",下一个字符为 "a",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[2],此时前缀子串为 "",下一个字符为 "a",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[1],此时前缀子串为 "a",下一个字符为 "a",相同,因此 next[5] = 1。
- 对于 i = 6,前缀子串为 "ababa",下一个字符为 "b",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[2],此时前缀子串为 "",下一个字符为 "b",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[1],此时前缀子串为 "a",下一个字符为 "b",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[0],此时前缀子串为 "",下一个字符为 "b",不相同,因此 next[6] = 0。
- 对于 i = 7,前缀子串为 "ababab",下一个字符为 "c",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[2],此时前缀子串为 "",下一个字符为 "c",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[1],此时前缀子串为 "a",下一个字符为 "c",不相同,因此需要回溯到前缀的 next 值所指向的位置,即 next[0],此时前缀子串为 "",下一个字符为 "c",不相同,因此 next[7] = 0。
最终得到的 next 数组为:[-1, 0, 0, 1, 2, 1, 0, 0]。
阅读全文