求解方法:
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数组的求法.