KMP算法理解
兩個月之前徹底理解的KMP算法,爲了準備九推機試,再複習一下
KMP的理解花了我很久的時間,這次重新複習,感覺又忘了很多內容,記錄一下
進入正題
KMP算法的寫法有很多,主要應當注意以下幾點
- next[]的定義
- 字符數組的標號從0還是1開始
我的理解
按最普通的想法,匹配就不用說了,直接輸出相應的匹配串的開始位置即可,失配的情況是i退到應當比較的下一個位置,j退回到最初位置
複雜度最壞情況是最後才匹配到i走一遍,j每一個i全走一遍,所以爲O(n*m)
KMP算法的思想,也就是優化的地方就是:
失配了i也不動,j退回到自己應該的地方,j退回到正確的位置可以保證不漏解
應用
1.求循環節: 循環節長 = len - Next[len],一定要注意,必須是len - Next[len]
例:沒有循環的時候必錯,因爲比 len 還小的數-Next[len]<len,而結果是 len
所以要注意,在求Next[]的時候,循環要(;i<len;)這樣才能把Next[len]求到