Нам нужно объединить 3 столбца в базе данных путем конкатенации. Тем не менее, три столбца могут содержать перекрывающиеся части, и детали не должны дублироваться. Например,
"a" + "b" + "c" => "abc"
"abcde" + "defgh" + "ghlmn" => "abcdefghlmn"
"abcdede" + "dedefgh" + "" => "abcdedefgh"
"abcde" + "d" + "ghlmn" => "abcdedghlmn"
"abcdef" + "" + "defghl" => "abcdefghl"
Наш текущий алгоритм довольно медленный, потому что он использует грубую силу для идентификации перекрывающейся части между двумя строками. Кто-нибудь знает эффективный алгоритм для этого?
Скажем, у нас есть 2 строки A и B. Алгоритм должен найти самую длинную общую подстроку S, так что A заканчивается на S и B начинается с S.
Наша текущая реализация грубой силы в Java привязана для справки,
public static String concat(String s1, String s2) {
if (s1 == null)
return s2;
if (s2 == null)
return s1;
int len = Math.min(s1.length(), s2.length());
// Find the index for the end of overlapping part
int index = -1;
for (int i = len; i > 0; i--) {
String substring = s2.substring(0, i);
if (s1.endsWith(substring)) {
index = i;
break;
}
}
StringBuilder sb = new StringBuilder(s1);
if (index < 0)
sb.append(s2);
else if (index <= s2.length())
sb.append(s2.substring(index));
return sb.toString();
}