Здесь мы идем - если первая даже не содержит первую букву второй строки, просто верните конкатенацию. В противном случае, перейдите от самого длинного к кратчайшему на второй строке, увидев, заканчивается ли с ней первая. Если это так, верните неперекрывающиеся части, иначе попробуйте одну букву короче.
public static String docat(String f, String s) {
if (!f.contains(s.substring(0,1)))
return f + s;
int idx = s.length();
try {
while (!f.endsWith(s.substring(0, idx--))) ;
} catch (Exception e) { }
return f + s.substring(idx + 1);
}
docat("Some little d", "little dogs are so pretty");
-> "Some little dogs are so pretty"
docat("Hello World", "World")
-> "Hello World"
docat("Hello", "World")
-> "HelloWorld"
EDIT: В ответ на комментарий здесь приведен метод использования массивов. Я не знаю, как правильно проверить тест, но ни один из них не взял на себя 1 миллион в моем тестировании.
public static String docat2(String first, String second) {
char[] f = first.toCharArray();
char[] s = second.toCharArray();
if (!first.contains("" + s[0]))
return first + second;
int idx = 0;
try {
while (!matches(f, s, idx)) idx++;
} catch (Exception e) { }
return first.substring(0, idx) + second;
}
private static boolean matches(char[] f, char[] s, int idx) {
for (int i = idx; i <= f.length; i++) {
if (f[i] != s[i - idx])
return false;
}
return true;
}
Это хороший пример, но OP хотел чего-то более эффективного. Для случая с довольно маленькими собаками это все еще создает много временных строк. Это можно избежать, предварительно получив массив 'char []' строк через 'String.toCharArray()' и реализуя пользовательский 'endsWith()', который сравнивает два таких массива. – user268396
@ user268396: Новая версия подходит вам больше? –
Я думаю, что использовать этот алгоритм (char [] версия). Кажется простым и быстрым. Спасибо. –