Здесь мы идем - если первая даже не содержит первую букву второй строки, просто верните конкатенацию.В противном случае переходите от самой длинной к самой короткой второй строке, чтобы увидеть, заканчивается ли первая из них.Если это так, верните непересекающиеся части, в противном случае попробуйте на одну букву короче.
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"
РЕДАКТИРОВАТЬ: В ответ на комментарий, здесь метод с использованием массивов.Я не знаю, как правильно провести стресс-тестирование, но ни один из них не занял более 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;
}