C'est parti - si la première ne contient même pas la première lettre de la deuxième chaîne, renvoyez simplement la concaténation. Sinon, on va du plus long au plus court sur la deuxième chaîne, en regardant si la première se termine par elle. Si c'est le cas, retournez les parties qui ne se chevauchent pas, sinon essayez une lettre plus courte.
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 : En réponse au commentaire, voici une méthode utilisant des tableaux. Je ne sais pas comment tester ces méthodes correctement, mais aucune d'entre elles n'a pris plus de 1 ms lors de mes tests.
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;
}