1. 程式人生 > >字符串----最長重復子串

字符串----最長重復子串

array 重復 sub 字符串 都是 get 解決問題 ring int

題目:求最長重復子串長度(可重復或者可交叉),例如 str = "abcbcbcbc",則最長重復子串為 "bcbcbc",最長重復子串長度為6。

思路:這道題用暴力解法的話不太現實,就算能實現效率也比較低。那這裏用到的就是後綴數組+高度數組就能解決問題,這裏有個規律:任何的子串都是某一個後綴數組的前綴。而高度數組本身就代表相鄰兩個後綴之間的最大公共前綴的長度。所以這裏求最長重復子串就是求高度數組的最大值。至於後綴數組和高度數組的介紹前面博客有。下面直接給出這道題的解法。

代碼:

 1 public class MaxRepeatSubString {
 2 
 3     public
static void main(String[] args) { 4 int res = maxRepeatSubString("123232323"); 5 System.out.println("最長重復子串長度:"+res); 6 } 7 8 public static int maxRepeatSubString(String src) { 9 // SuffixArray 在字符串匹配(三)----後綴數組算法這篇博客裏 10 SuffixArray.Suff[] sa = SuffixArray.getSa2(src);
11 int[] height = SuffixArray.getHeight(src, sa); 12 int maxHeight = 0; 13 int maxIndex = -1; 14 for (int i = 0; i < height.length; i++) { 15 if (height[i] > maxHeight) { 16 maxHeight = height[i]; 17 maxIndex = i;
18 } 19 } 20 int index = sa[maxIndex].index;// 轉成原始下標 21 System.out.println("最長重復子串:" + src.substring(index, index + maxHeight)); 22 return maxHeight; 23 } 24 25 }

結果:

  技術分享圖片

字符串----最長重復子串