KMP-next数组
生活随笔
收集整理的這篇文章主要介紹了
KMP-next数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前看的模模糊糊現在終于清楚了。
主要是這一段代碼的問題
void getkmp()
{int k=-1,j=0;nex[0]=-1;while(j<m){if(k==-1||b[j]==b[k]){k++;j++;nex[j]=k;}elsek=nex[k];}
}
next[j]表示b串0~j-1的最長前綴后綴字串的長度//特別重要
例如b數組:? a? b a a b b a b a a b
那next數組:-1 0 0?1 1 2 0 1 2 3 4 5
設用b串來匹配大串a
設next[j]=x;
一個可以確定的就是,b串的0~x-1與 j-x~j-1?的元素是相同的
然后開始匹配,展示復雜度會被優化的地方。
串串是從i=0開始記錄的
設a:abcdabcdabce? 變量用j
設b:abcdabce 變量用k
a和b一個一個匹配到了a[7]='d' , b[7]='e',不相等了,然后此時k=j=7;
然后你知道了0~6他們倆都是匹配的,這個時候可以直接k=next[k]=3;j此時還是7
開始問自己,為啥k=next[k]呢?
想要從a串中找到一個b串的話,現成的匹配成功的部分就剩下了b數組的0~next[k]-1;
也就是說a的4~6(a[j-3]~a[j-1])部分與b串中的0~2,都是下劃線部分相同。
這時候你就比較a[j]與b[ next[k] ]不相等就完了,此時的話就是a[7]與b[3],相等話接著匹配,直到j=b串長度的時候就相當于你匹配成功,不然就吧j繼續等于next[j],反正就是能與a串盡可能相同的部分。如果一直next【k】下去等于-1,那么就沒用相等的,重新從b[0]與a[j]匹配,就跟剛開始的狀態是一樣的。
然后就是找next數組的過程,其實與找匹配的原理一樣。自己模擬一邊就懂了。
總結
以上是生活随笔為你收集整理的KMP-next数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HYSBZ - 1798 Seq 维护
- 下一篇: Keywords Search AC自动