KMP的妙用(利用next陣列尋找字串的迴圈節)

2022-08-31 10:09:10 字數 901 閱讀 5792

利用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即為長度最小的迴圈節。

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

HDU3336 KMP之next陣列妙用

本題要求所給字串的字首在整個字串中出現的次數的累加和。kmp演算法的運用。容易聯想到kmp演算法中的next陣列,當next i 0時可以理解為i前面的next個字元組成的字串對應乙個字首。此外長度為n的字串有n個字首。所以res等於n加上所有next值大於0的元素的個數。例如 abab 那麼他的字...

KMP演算法 next陣列

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...

KMP演算法 NEXT陣列

kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...