最长公共子串可以使用字符串后缀法,后缀数组是一种数据结构,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。 这样的时间复杂度为:生成后缀数组 O(N),排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N) 依次检测相邻的两个字符串 O(N * N),总的时间复杂度是 O(N^2*logN),优于第一种方法的 O(N^3)。
java代码如下:
public class RepeatedStr {
public static int maxLengthRepeatedStr(String str) {
List<String> list = new ArrayList<String>();
int length = str.length();
int maxLength = 0;
for (int i = 0; i < length; i ++) {
list.add(str.substring(i));
}
Collections.sort(list);
for (int i =0; i < list.size() - 1; i++) {
int t = 0;
String a = list.get(i);
String b = list.get(i + 1);
int aL = a.length();
int bL = b.length();
for (int j = 0; j < aL && j < bL; j ++) {
if (a.charAt(j) == b.charAt(j))
t ++;
else
break;
}
if (t > maxLength)
maxLength = t;
}
System.out.println(list);
return maxLength;
}
public static void main(String[] args) {
System.out.println(maxLengthRepeatedStr("aabcfdfaabcdd"));
}
}
测试结果正确。