求next数组和nextval数组
复习到kmp算法,查了些资料,在此记录一个相对简单的求next和nextval的方法
1.求next数组
当i<2时:
next[1]=0
next[2]=1
当i>2时:
在字符串s中,s[1]~s[i-1]是长度为i-1的字符子串,这一字符子串的前缀、后缀最长公共元素的数量记为k;
则:
next[i]=1+k
例:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
字符串 | a | b | c | a | a | b | b | c | a | b |
k | - | - | 0 | 0 | 1 | 1 | 2 | 0 | 0 | 1 |
next | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 1 | 1 | 2 |
2.求nextval数组
记p = next[i] ;
将 s[i] 与 s[p] 进行比较:
1)二者相同,则,nextval[i] = next[p]
2)二者不同,则,nextval[i] = p
例:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
字符串 | a | b | c | a | a | b | b | c | a | b |
next | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 1 | 1 | 2 |
nextval | 0 | 1 | 1 | 0 | 2 | 1 | 3 | 1 | 0 | 1 |