Эта строка является вашей проблемой:
s = s1+common+s2.substring(L);
Это должно быть:
s = s1+s2.substring(L);
Поскольку вы запрашиваете лучший способ сделать это, перебирая символывероятно, будет значительно быстрее:
int i = 0;
for ( s1Length = s1.length; i < s1.length(); i++ ) {
if ( s1.charAt( i ) == s2.charAt( 0 ) {
boolean matches = true;
for ( int j = i, k = 0, remaining = s1.length - i; k < remaining; k++, j++ ) {
if ( s1.charAt( j ) == s2.charAt( k ) ) {
matches = false;
break;
}
}
if ( matches ) {
break;
}
}
}
s = s1.substring( 0, i ) + s2;
Обратите внимание, что это не проверено, но перебирает алгоритм ...
Просто подумал еще об одномЕсли вы сравнили длину 1 с длиной 2 перед тем, как сделать это, вы могли бы сделать ее более эффективной, выбрав итерацию во внешнем цикле.Если, например, s2 короче s1, вы можете увидеть улучшение производительности (хотя и незначительное), выполнив итерацию в обратном направлении от конца двух строк с s2 в внешнем цикле.Вероятно, не стоит, но вы попросили больше предложений ...