字符串----最長重復子串
阿新 • • 發佈:2019-01-27
array 重復 sub 字符串 都是 get 解決問題 ring int
題目:求最長重復子串長度(可重復或者可交叉),例如 str = "abcbcbcbc",則最長重復子串為 "bcbcbc",最長重復子串長度為6。
思路:這道題用暴力解法的話不太現實,就算能實現效率也比較低。那這裏用到的就是後綴數組+高度數組就能解決問題,這裏有個規律:任何的子串都是某一個後綴數組的前綴。而高度數組本身就代表相鄰兩個後綴之間的最大公共前綴的長度。所以這裏求最長重復子串就是求高度數組的最大值。至於後綴數組和高度數組的介紹前面博客有。下面直接給出這道題的解法。
代碼:
1 public class MaxRepeatSubString { 2 3 publicstatic 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 }
結果:
字符串----最長重復子串