KMP演算法 next陣列的應用 迴圈節問題

2021-08-06 07:47:07 字數 653 閱讀 5434

先來個next陣列模板

void next()

{ int i=0,j=-1;

next[0]=-1;

while(i

1:i-next[i]是最小迴圈節的長度

2:字串的迴圈條件是i%(i-next[i])==0&&next[i]!=0

3:最小迴圈節的迴圈次數是i / (i-next[i])

4:整體 在  字串 s

l= strlen(s)

n = next[l]

l%(l-next[l])==0                     有迴圈節

k = l - n= l - next[l]                 最小迴圈節 

1>  p = l%k=l%(l-next[l])            迴圈k節點若干次後剩餘部分的長度  

2> q = (k-p)%k =k-q                       q為字串s1要想補齊成恰好整數個k所需要的最少字元數 

對於1  aba

ba  

沒有迴圈節  next[l]=3  最小迴圈節l-next[l]=2  

則 取餘說明 還剩多少節點沒有迴圈  如最後乙個a

正對2如果最小迴圈節減去取餘後的   則得到補齊整數時所需的字串

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陣列的演算法給優化得已經很無解了,以至於至今我...

KMP演算法的next陣列

本文參考 google 資料結構 c語言 include include author silence time 2012 5 19 description kmp演算法的next using namespace std void next char t,int l,int next else 1 ...