利用後綴數組 前綴 LCP最長公共前綴求第K大的子串

下面藉助一道題目和大家一起討論:LCP及前綴 後綴數組的問題
題目:
food所有的組成情況如下:
d          
f
fo
foo
food
o
od
oo
ood
按照字母順序排列如上所示,現要求第k大的子串,例如第8大子串爲oo
思路:蠻力就不說了,高級別考試肯定超時。這種題目是典型的利用後綴樹和後綴數組解決的。

1. 將所有後綴列出來(prefix set)
d
od
ood
food
2. 對所有後綴子串進行排序,保存其在原來子串中位置SA(suffix array)
d           4
food        1
od          3
ood         2
3. 對相鄰兩個子串,求其LCP,即最長公共前綴
d           0(自己)
food        0(food與d)
od          0(od與food)
ood         1(od與ood)
4. 求第8大的子串:strlen("d")+strlen("food")+strlen("od")=7
因此第8大的子串即爲"ood"子串的第一個前綴
而ood的前綴爲:
o
oo
ood
因此應該是o,but前面我們明明手算第8大是oo的呀?
稍等,還沒結束呢,剛剛不是計算得出了LCP嗎?它就被用在這個地方了,由於出現重複情況,因此我們必須將LCP剔除在外
即ood前綴的第1+LCP(ood)個,即ood的第2個前綴子串
好了,思路如上,大家有興趣可以按照這個思路寫實現代碼~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章