经典指数          
原因
1533
浏览数
0
收藏数
 

一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。

     举报   纠错  
 
切换
1 个答案
利用后缀数组。首先输入一个字符串到数组arr中,例如“ abczzacbca ”,读入时我们队指针的数组进行初始化,使得每个元素指向输入字符串的相应字符,则元素arr[0]指向整个字符串,下一个元素指向从第二个字符开始的数组后缀,等等。对于前面的输入字符串,该数组能够表示下面这些后缀: arr[0]=abczzacbca arr[1]=bczzacbca arr[2]=czzacbca arr[3]=zzacbca arr[4]=zacbca arr[5]=acbca arr[6]=cbca arr[7]=bca arr[8]=ca arr[9]=a 如果某个长字符串在数组中出现两次,那么它将出现在两个不同的后缀中,因此我们对数组排序以寻找相同的后缀,下面将上面的数组进行数组排序,结果如下 arr[0]=a arr[1]=abczzacbca arr[2]=acbca arr[3]=bca arr[4]=bczzacbca arr[5]=ca arr[6]=cbca arr[7]= czzacbca arr[8]= zacbca arr[9]=zzacbca 然后我们就可以扫描数组,通过比较相邻元素来找出最长的重复字串,如上为"bc" java coder 如下: import java.util.*; public class LongestSameSubString { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); while (in.hasNext()) { String str = in.nextLine(); String[] strArr = new String[str.length()]; for (int i = 0; i < str.length(); i++) { strArr[i] = str.substring(i); } Arrays.sort(strArr); int maxlen = -1; int maxi = 0; int len = 0; for (int i = 0; i < strArr.length - 1; i++) { len = commonSubStrLen(strArr[i], strArr[i + 1]); if (len > maxlen) { maxlen = len; maxi = i; } } if (maxlen==-1) { maxlen=0; } System.out.printf("%s\n", strArr[maxi].substring(0, maxlen)); } in.close(); } static int commonSubStrLen(String str1, String str2) { int maxLen = 0; int index = 0; int len = str1.length() > str2.length() ? str2.length() : str1.length(); while (index < len && (str1.charAt(index) == str2.charAt(index++))) { maxLen++; } return maxLen; } }
 
切换
撰写答案