1. 程式人生 > >KMP的妙用(利用next數組尋找字符串的循環節)

KMP的妙用(利用next數組尋找字符串的循環節)

images 關系 其中 一次 容易 line 數組 最大 最小

利用KMP的next數組的性質,我們可以找到next數組的循環節。

先說結論:

設字符串長n,則若其 i % ( i – next[n] ) == 0 ,則其有循環節(循環節數目大於1),其循環節數目為 i / ( i – next[n] )

這裏的next數組存儲的是匹配到i匹配不成立時,下一個要匹配的位置。即next數組記錄的是下一次匹配的位置,而不是下一次匹配的偏移量,若是記錄的偏移量,只需修改一下公式即可。

言歸正傳,我們先證明第一個結論,根據下圖來進行說明:


技術分享

若結論中的關系成立(整除為4段),則會出現如上圖所示情況,其中,A2+A3+A4段 == A1’+A2’+A3’段。

由於

A2+A3+A4段 == A1’+A2’+A3’段

所以:

A2==A1’ A3==A2’ A4==A3’

又因為:

A1’==A1 A2’==A2 A3’==A3

所以:

A2==A1 A3==A2 A4==A3

具有循環節,結論得證。

根據next數組的性質,我們也可以得知此循環節的長度是最小的:

next[n]可以理解為字符串前綴與後綴最大的相同串。所以剩下的A1即為長度最小的循環節。

第二個結論很容易就能得出。

KMP的妙用(利用next數組尋找字符串的循環節)