KMP與最小覆蓋子串

我對KMP的一些理解(lyp點撥的):pre[i](或next[i])的實質是串str[1..i]的最長且小於i的“相等前、後綴”分別爲str[1..pre[i]](前綴)與str[(i-pre[i]+1)..i](後綴),通俗講就是:使str[1..i]前k個字母與後k個字母相等的最大k值。

KMP算法詳解可見:http://blog.csdn.net/fjsd155/article/details/6864233

另外一個結論:

最小覆蓋子串(串尾多一小段時,用前綴覆蓋)長度爲n-next[n](n-pre[n]),n爲串長。

證明分兩部分:

1-長爲n-next[n]的前綴必爲覆蓋子串。

當next[n]<n-next[n]時,如圖a,長爲next[n]的前綴A與長爲next[n]的後綴B相等,故長爲n-next[n]的前綴C必覆蓋後綴B;


當next[n]>n-next[n]時,如圖b,將原串X向後移n-next[n]個單位得到Y串,根據next的定義,知長爲next[n]的後綴串A與長爲前綴串B相等,X串中的長爲n-next[n]的前綴C與Y串中的前綴D相等,而X串中的串E又與Y串中的D相等……可見X串中的長爲n-next[n]的前綴C可覆蓋全串。


2-長爲n-next[n]的前綴是最短的。

如圖c,串A是長爲n-next[n]的前綴,串B是長爲next[n]的後綴,假設存在長度小於n-next[n]的前綴C能覆蓋全串,則將原串X截去前面一段C,得到新串Y,則Y必與原串長度大於next[n]的前綴相等,與next數組的定義(使str[1..i]前k個字母與後k個字母相等的最大k值。)矛盾。得證!有人問,爲什麼Y與原串長大於next[n]的前綴相等?由假設知原串的構成必爲CCC……E(E爲C的前綴),串Y的構成必爲CC……E(比原串少一個C),懂了吧!

發佈了41 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章