В Java, поскольку String является неизменным, конкатенация String будет более сложной, чем кажется.
Для каждой конкатенации создается новая строка, копирующая содержимое исходной строки, что приводит к линейной сложности O (n) , где n - длина строки, поэтому для m таких операций это O (m * n) , можно сказать, что оно имеет квадратичную сложность O (n ^ 2) .
Мы можем использовать StringBuilder, который имеет O (1) сложность для каждого добавления. Ниже приведена рекурсивная программа, использующая StringBuilder. При этом используются только n / 2 стековых фрейма, поэтому он имеет меньшую сложность пространства, чем обычный рекурсивный вызов, который будет выглядеть как s.charAt(s.length-1) + reverse(s.subString(0, s.length-2);
public class StringReverseRecursive {
public static void main(String[] args) {
String s = "lasrever gnirts fo noitatnemelpmi evisrucer a si sihT";
StringBuilder sb = new StringBuilder(s);
reverse(s, sb, 0, sb.length() - 1);
System.out.println(sb.toString());
}
public static void reverse(String s, StringBuilder sb, int low, int high) {
if (low > high)
return;
sb.setCharAt(low, s.charAt(high));
sb.setCharAt(high, s.charAt(low));
reverse(s, sb, ++low, --high);
}
}