1.后缀数组和高度数组联合可以求解最长重复子串(可重叠或者说可交叉)的问题
例如:"123232323"的最长重复子串为232323,因为后缀23232323的前缀为232323与后缀232323的最大重复的元素为232323
所以它的最长重复子串为232323
sa数组的相关情况如下:(sa数组为所有后缀排好名之后的字符串数组,而且还绑定了后缀的下标
)
字符串 索引 排名
123232323 0 0
23 7 1
2323 5 2
232323 3 3
23232323 1 4
扫描二维码关注公众号,回复: 3359418 查看本文章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 后缀数组与高度数组的应用 {
public static void main(String[] args) {
String src = "123232323";
int res = maxRepeatSubString(src);
System.out.println(res);
}
public static int maxRepeatSubString(String src) {
Suff[] sa =Suff.getSa(src); //调用Suff类的getSa方法来生成绑定下标排好序之后的sa数组
int[] height = 高度数组.getHeight(src, sa); //调用高度数组类中getHeight()方法来生成高度数组
int maxHeight = 0;
int maxIndex = -1;
for (int i = 0; i < height.length; i++) {
if (height[i] > maxHeight) {
maxHeight = height[i];
maxIndex = i;
}
}
int index = sa[maxIndex].index;//转成原始下标
//System.out.println(src.substring(index,index+maxHeight));
return maxHeight;
}
}
最后求出"123232323"的最大重复子串长度为6