Решение:
Класс
LongestSubstringFinder, производящий эту операцию:
import java.util.Arrays;
public final class LongestSubstringFinder {
private LongestSubstringFinder() {}
public static String findLongestSubstringAtString(String string) {
string = string.replaceAll("\\s+", " ");
int quantityOfSuffixes = string.length();
String[] suffixes = new String[quantityOfSuffixes];
for (int i = 0; i < quantityOfSuffixes; i++) {
suffixes[i] = string.substring(i, quantityOfSuffixes);
}
Arrays.sort(suffixes);
String longestRepeatedSubstring = "";
for (int i = 0; i < quantityOfSuffixes - 1; i++) {
String x = findLongestCommonPrefixOfTwoStrings(suffixes[i], suffixes[i + 1]);
if (x.length() > longestRepeatedSubstring.length()) {
longestRepeatedSubstring = x;
}
}
return longestRepeatedSubstring;
}
private static String findLongestCommonPrefixOfTwoStrings(String first, String second) {
int quantity = Math.min(first.length(), second.length());
for (int i = 0; i < quantity; i++) {
if (first.charAt(i) != second.charAt(i))
return first.substring(0, i);
}
return first.substring(0, quantity);
}
}
Тесты(
пройдены):
@Test
public void testFindLongestSubstringAtStringFirst() throws Exception {
String testString = "Сайт toster, бла бла бла Сайт toster";
String neededResult = "Сайт toster";
String longestSubstring = LongestSubstringFinder
.findLongestSubstringAtString(testString);
assertEquals(longestSubstring, neededResult);
}
@Test
public void testFindLongestSubstringAtStringSecond() throws Exception {
String testString = "aboibooolsabbooolsadf";
String neededResult = "booolsa";
String longestSubstring = LongestSubstringFinder
.findLongestSubstringAtString(testString);
assertEquals(longestSubstring, neededResult);
}
Об алгоритме:
здесь и
здесь.