求解方法:
next数组中第一位写0,第二位写1 。求解后面每个元素的next值时,将该元素前一个元素next值所对应下标的元素进行比较,如果相同,则将前一元素next值+1作为当前元素的next值;否则,则将前一元素next值所对应下标的元素作为新元素重复上述操作;如果找到则将前面元素next值+1作为待求元素的next值;如果找到最前面都找不到相同元素,则将待求元素的next值赋为1。
实例如下:
设模式串为 abaabcaba
第一步:将第 1 个元素和第 2 个元素的next值设置为 0 和 1 。
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | |||||||
| 第二步:求第 3 个元素 a 的next值,则将其前一元素也就是第 2 个元素 b 的next值 1 与其所对应下标为 1 的元素 a 进行比较;经比较 b 与 a 不同,则第 3 个元素的next值设置为 1 。 | |||||||||
![]() | |||||||||
| 得到: | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | ||||||
| 第三步:求第 4 个元素 a 的next值,将前一个元素也就是第 3 个元素 a 的next值 1 与下标为 1 的元素进行比较;相同,则将第 3 个元素的next值 +1 作为第 4 个元素的next值。 | |||||||||
![]() | |||||||||
| 得到: | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | |||||
| 第四步:求第 5 个元素的next的值,将第 4 个元素 a 的next值 2 所对相应下标的元素 a 进行比较,不同;则比较第 2 个元素的 b 与其next值 1 所对应下标的元素 a 进行比较,相同,则将第 2 个元素next值 +1 作为第 5 个元素的next值。 | |||||||||
![]() | |||||||||
| 得到: | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | 2 | ||||
| 第五步:求第六个元素 c 的next值,将第五个元素 b next值 2 所对应下标的元素 b 进行比较,相同;则将第 5 个元素的next值 +1 作为第 6 个元素的next值。 | |||||||||
| 得到: | |||||||||
![]() | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | 2 | 3 | |||
| 第六步:经比较到最前面,值仍然不同,故将第 7 个元素的next值设置为 1 。 | |||||||||
![]() |
得到:
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | 2 | 3 | 1 | ||
| 第七步: | |||||||||
![]() | |||||||||
| 得到: | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 | |
| 第八步: | |||||||||
![]() | |||||||||
| 得到: | |||||||||
| 下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| -------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 模式串 | a | b | a | a | b | c | a | b | a |
| next | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 | 3 |
至此,构建完成next数组。
关于计算NextVal数组请移步:手算KMP算法nextval数组。
参考文章:
详解KMP算法中Next数组的求法.

本文详细解析了KMP算法中Next数组的构建过程,通过实例演示如何为模式串abaabcaba构建Next数组,逐步解释了每个元素Next值的确定方法。







1385





