首先,手算next数组是非常简单的,仔细看完下面的步骤,你必定会求解next数组。next数组的算法是第j位字符前面j-1位字符组成的字串前后缀重合字符数+1。前缀:包含首个字符而不包含末尾字符,后缀:包含末尾字符而不包含首位字符,
你不一定要理解透彻文字意义,耐心观看下面的步骤,即使你不理解文字,你也可以极快的求解next数组。
我们由下面这个简单的例子来演示一遍求解next数组。
给定一个字串T=“abaabcac",列出下边表格:
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next |
- 由定义可知next数组第一位一定是0,第2位一定是1。
求子串T="abaabcac"的next数组 编号 1 2 3 4 5 6 7 8 T a b a a b c a c next 0 1 - 此时求解next[3],其实就是求第3位字符前2位字符组成的字串前后缀重合字符数+1,此时ab为前两位字符,前缀为a,后缀为b,重合数为0,则next[3]=0+1=1
求子串T="abaabcac"的next数组 编号 1 2 3 4 5 6 7 8 T a b a a b c a c next 0 1 1
3.next[4]的算法,求第4位字符前3位字符组成的字串前后缀重合字符数+1,此时aba为前3位字符,
而aba中,前缀分别为a,ab
后缀分别为a,ba,此时重合字符为1,则next[4]=1+1=2
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 |
4.next[5]的算法,求第5位字符前4位字符组成的字串前后缀重合字符数+1,此时abaa为前4位字符,
前缀分别为a,ab,aba,
后缀分别为a,aa,baa,重合字符为1,则next[5]=1+1=2
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 | 2 |
5.next[6]的算法,求第6位字符前5位字符组成的字串前后缀重合字符数+1,abaab为前5位字符,
前缀分别为a,ab,aba,abaa,
后缀分别为b,ab,aab,baab,重合字符为2,则next[6]=2+1=3
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 | 2 | 3 |
6.next[7]算法,求第7位字符前6位字符组成的字串前后缀重合字符数+1,abaabc为前6位字符,
前缀分别为a,ab,aba,abaa,abaab
后缀分别为c,bc,abc, aabc,baabc,重合字符为0,则next[7]=0+1=1
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 | 2 | 3 | 1 |
7.next[8]算法,求第8位字符前7位字符组成的字串前后缀重合字符数+1,abaabca为前7位字符,
前缀分别为a,ab,aba,abaa,abaab,abaabc
后缀分别为a,ca,bca,abca,aabca, baabca,重合字符为1,则next[8]=1+1=2
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | a | b | a | a | b | c | a | c |
next | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
以上便是手算next数组方法,如有不足之处,请指出,下篇文章将通过代码实现next数组求解以及优化后的nextval求解。