KMP的妙用(利用next數組尋找字符串的循環節)
阿新 • • 發佈:2017-07-04
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數組尋找字符串的循環節)