串的模式匹配KMP算法中next[]数组的求解总结
步骤(1) | 初始化 next[1]=0 next[2]=1; |
步骤(2) | 求next[j],令k=next[j-1] |
步骤(3) | S[j-1] S[k] 比较大小 = , next[j]=k+1 != , k=next[k], k!=0, 返回(3); k= 0,next[j]=1 |
根据以上方法,在具体习题中,需要建立一个表格,即可解决此类问题。
j(字符串位序) | 1 | 2 | 3 | 4 | 5 | .... |
S[j] (字符串对应位序的字符) | ... | ... | ... | ... | ... | ... |
next[j] (下一次需要开始匹配的字符位序) | ... | ... | ... | ... | ... | ... |
具体计算过程
下面是结合具体例题的实际计算过程:
例题:在kmp算法中进行模式匹配,模式串为“ababaaababaa”的next数组值为( )
首先建立表格如下:
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
S[j] | a | b | a | b | a | a | a | b | a | b | a | a |
next[j] |
然后按照方法进行计算next(j)数组:
1),初始化:next[1]=0 next[2]=1
2), j=3 ,求 next[3],
k = next[j-1]=next[3-1]=next[2]=1,
S[k]=S[1]=a S[j-1]=S[3-1]=S[2]=b S[k]!=S[j-1] k=next[k]=next[1]=0
next[3]=1
3),j=4, 求next[4]
k=next[j-1]=next[4-1]=next[3]=1
S[k]=S[1]=a S[j-1]=S[4-1]=S[3]=a S[k]=S[j-1] next[j]=k+1
next[4]=1+1=2
4),j=5,求next[5]
k=next[5-1]=next[4]=2
S[k]=S[2]=b S[j-1]=S[4]=b S[k]=S[j-1] next[j]=k+1
next[5]=2+1=3
5),j=6,求next[6]
k=next[6-1]=next[5]=3
S[k]=S[3]=a S[j-1]=S[5]=a S[k]=S[j-1]
next[j]=k+1=4
6),j=7,求next[7]
k=next[7-1]=next[6]=4
S[k]=S[4]=b S[j-1]=S[6]=a S[k]!=S[j-1] k=next[k]=next[4]=2
S[k]=S[2]=b S[k]!=S[j-1] k=next[k]=next[2]=1
S[k]=S[1]=a S[k]=S[j-1]
next[j]=k+1=2
7),j=8,求next[8]
k=next[8-1]=next[7]=2
S[k]=S[2]=b S[j-1]=S[7]=a S[k]!=S[j-1] k=next[k]=next[2]=1
S[k]=S[1]=a S[k]=S[j-1]
next[j]=k+1=2
8),j=9,求next[9]
k=next[9-1]=next[8]=2
S[k]=S[2]=b S[j-1]=S[8]=b S[k]=S[j-1]
next[j]=k+1=3
9),j=10,求next[10]
k=next[10-1]=next[9]=3
S[k]=S[3]=a S[j-1]=S[9]=a S[k]=S[j-1]
next[j]=k+1=4
10),j=11,求next[11]
k=next[11-1]=next[10]=4
S[k]=S[4]=b S[j-1]=S[10]=b S[k]=S[j-1]
next[j]=k+1=5
11),j=12,求next[12]
k=next[12-1]=next[11]=5
S[k]=S[5]=a S[j-1]=S[11]=a S[k]=S[j-1]
next[j]=k+1=6
因此表格填写如下:
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
S[j] | a | b | a | b | a | a | a | b | a | b | a | a |
next[j] | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 5 | 6 |