字尾陣列與高度陣列的使用(求解最長重複子串)

2021-08-27 16:01:42 字數 2177 閱讀 7542

1. 字尾陣列和高度陣列聯合可以求解最長重複子串(可重疊或者說可交叉)的問題

例如:"123232323"的最長重複子串為232323,因為字尾23232323的字首為232323與字尾232323的最大重複的元素為232323

所以它的最長重複子串為232323

字串                    索引             排名

123232323              0                   0

23                            7                   1

2323                        5                   2

232323                    3                   3

23232323                1                   4

3                              8                   5

323                          6                   6

32323                      4                   7

3232323                  2                   8

2. 而高度陣列是用來求解某兩個排名相近的字尾的最長公共字首,所以我們可以利用高度陣列來求解最長重複子串的問題

高度陣列的情況

字串                                  height[k]                索引

123232323                                 0                       0

23                                               0                       7            

2323                                           2                       5

232323                                       4                       3

23232323                                   6                       1

3                                                 0                       8

323                                             1                       6

32323                                         3                       4

3232323                                     5                       2

從上面可以看出使用求出高度陣列中的最大值就可以解決最大重複子串的問題

具體的**如下:

public class main 

public static int maxrepeatsubstring(string src)

}int index = sa[maxindex].index;//轉成原始下標

return maxheight;

}}

求解高度陣列的**為:

public class main {

public static int getheight(string src,suff sa){

//suff sa =getsa2(src);

int strlength = src.length();

int rk = new int[strlength];

//將rank表示為不重複的排名即0~n-1

for(int i = 0; i0) k--;

for(;j+k最後求出"123232323"的最大重複子串長度為6

HDU5769字尾陣列,高度陣列模板

首先學一波字串的一些性質。首先求出字串的字尾陣列和高度陣列之後,就可以求出這個字串有多少個不同的字串。ps 這個字尾陣列模板為倍增 基數排序。複雜度nlog n 基數排序o n 倍增是log但是常數太大,高度陣列可以利用字尾陣列o n 求出!include include include inclu...

高度陣列與最長公共字首

摘要 本文是關於字尾陣列的乙個拓展,問題模型來自於最長公共字首 longest common prefix array 問題,我們為解決該模型,在字尾陣列的基礎上設計了乙個精巧的陣列 高度陣列,同時由於該陣列在處理各類字串相關問題時有著較好的用途,因此值得掌握。本文將直接從高度陣列講起,假設讀者具有...

字尾陣列的學習筆記與例題

前言 字尾陣列真神奇。字尾 對於乙個字串,定義suffix i 為以i起點至結尾的子串。例如ababc,suffix 3 bc 字尾樹 字尾樹容易理解,就是把乙個字串的所有字尾串插入到乙個字典樹上 字典樹不再累贅 如圖為 ababc 的字尾樹 建造這棵樹的代價是o n n 的空間複雜度,沒什麼實用性...