Я не совсем уверен, что вы имеете в виду, когда говорите, что вам нужен эффективный алгоритм.
Я могу придумать способы перестановки строки (все они уже упоминались в других ответах):
Используйте стек (ваша идея).
Создайте новую перевернутую строку, добавив символы один за другим в обратном порядке от исходной строки к пустой строке / StringBuilder / char [].
Обмен всех символов в первой половине строки с соответствующей позицией в последней половине (т. Е. I-й символ заменяется на (length-i-1) -й символ).
Дело в том, что все они имеют одинаковую сложность во время выполнения : O (N). Таким образом, нельзя утверждать, что кто-либо значительно лучше других для очень больших значений N (то есть очень больших строк).
Третий метод имеет одну цель: два других требуют O (N) дополнительного пространства (для стека или новой строки), в то время как он может выполнять перестановки на месте. Но строки являются неизменяемыми в Java, поэтому вам необходимо в любом случае выполнить перестановку во вновь созданном StringBuilder / char [] и, следовательно, в конечном итоге потребуется O (N) дополнительного пространства.