(转帖)KMP算法中的 Next 求解方法

 
(转帖)KMP算法中的 Next 求解方法 1 T( A$ {# T- D/ v# ^0 f
!!向作者 zmrbak 致敬 5 W; i2 q# F$ V  n1 L, _

3 `- z+ m% N9 p# G! rKMP的NEXT数组的求法 ' `2 n1 U" H- T4 f: R( {
- I0 y$ u& q. B+ g. T/ }

; a: k( r% e' T# Z1 j2 p% D串 ‘ababaaababaa’ 的next数组为(  )。【中山大学 1999 一、7】 4 E/ ]5 K" p& }" I+ Q* q6 m
A.012345678999 B.012121111212 C.011234223456  D.0123012322345
% _" n2 c' d( [8 n$ ca        b        a        b        a        a        a        b        a        b          a           a
! J5 z6 Y* a# q( V; c1        2        3        4        5        6        7        8        9        10        11        12
+ N% c' A7 @- ]/ D现在我们直接求NEXT数组中的第10位 : d& x9 s7 c8 a- C& [1 V
j=10; " q  C( R1 I! s( E- j
根据定义要求: % Q% m7 t7 a% W  {: S' t2 {
        1<k<j ; z8 Y. x( x/ S& x" [1 ^0 f
那么k值最大只能取j-1=10-1=9了。 3 F' K5 J9 s, _, [, V9 x. k
P1P2….Pk-1 字符串就是‘P1P2….P8’ 1 ?3 u0 O' d$ B" ?
Pj-k+1…Pj-1字符串就是‘P2P3……P9’
- j5 c' ^5 Z  c& g2 ?# x8 f参考上表,实际上就变成了下表字符串的比较: 1 U) |3 ?; j, B% y: l/ a3 A
K值                      1        2        3        4        5        6        7        8 " ?5 ~" A6 W1 Q
* X$ M* ~& B: v3 s0 F3 T
                             2        3        4        5        6        7        8        9
' n$ b! c$ i6 X1 Q) X8 j, Q        匹配结果
, }& K& a* h5 }) P9                           a        b        a        b        a        a        a        b 2 E; X9 Q1 \9 ^# o. l: {6 _
                             b        a        b        a        a        a        b        a
- d( h7 H1 I# Y6 `  d: U  r           X % ~8 U% L5 W8 A' _8 h# K, Q
8                           a        b        a        b        a        a        a        
/ S& w7 @' U" S( W                             a        b        a        a        a        b        a # @* Y1 s$ ?* L' d/ h
           X $ q! n& D7 P! z. O) j
7                          a        b        a        b        a        a                + c9 [% T  ~  c& t0 J6 W
                             b        a        a        a        b        a ) `$ W5 P& p2 p5 x; m
           X
2 G, _: [/ V3 i4 S1 y( j6                          a        b        a        b        a                        
5 n) q# X" {4 N# q                            a        a        a        b        a
1 u9 Y) L0 I8 }$ O: F4 S           X - R7 {* h9 t. Y8 B
5                         a        b        a        b                                
' y( \! T& p( u% D# r8 R, i# Y                           a        a        b        a
1 R1 R7 i5 J, n6 W           X
) i7 c7 _% B% c  F/ l* q4 P4                         a        b        a                                       
8 e  F% b9 E8 o2 L: ^$ I9 a4 N                           a        b        a
0 D, {+ K' g% P& O           OK
: {! k1 b5 W- z. S$ Q3                         a                                                         3 L& E6 l$ J+ p+ ~" d2 e
                 b        a
3 Q. i% C! e- R0 _! k# M        无需比较
+ h, U- U7 U+ r( V. K, n- F- e如上图示,很快“计算出”NEXT数组中第十的数字为“4”。其他位置的值可以按照上面的方法处理。

你可能感兴趣的:(ext)