Как правильно написать условие для сравнения строки класса StringBuilder с её реверсом и поместить это в цикл?

214
10 декабря 2021, 09:50

Суть задачи: дана строка. Из неё нужно сделать палиндром (когда слово читается одинаково и с начала и с конца) минимально возможной длины. Например, есть строка "abcded", из нее должно получится abcdedcba.

В целом логика решения понятна, но я не могу её реализовать в коде. Сравниваем строку с её реверсом, если не равно, то добавляем первую букву вконец, на втором проходе вторую букву добавляем на предпоследнее место и т.д.,пока не получится палиндром.

Сначала я пытался решить эту задачу с помощью списков, но слишком громоздко и запутанно, так и не получилось.

Использовав StringBuilder набросал такой код:

StringBuilder sb = new StringBuilder("abcded");
        sb.insert(sb.length(), sb.charAt(0));
        int count = 1;
       while (sb != sb.reverse()){
           sb.insert(sb.length() - count, sb.charAt(count));
           count++;
       }
        System.out.println(sb);

На выходе получаю "adedcba". Пробовал использовать if else, for, всё одно и тоже. Пробовал изменить само условие например на if (str.equals(str.reverse())). Видимо я неправильно пишу условие, да и не совсем понимаю, как работает equals или reverse внутри цикла. Я так понял, что когда делаешь реверс строки даже внутри условия, то строка остается в этом состоянии и нужно её возвращать в исходное положение? Короче говоря, нужно этот код поместить в цикл, и чтобы всё заработало:

StringBuilder sb = new StringBuilder("abcded");
        sb.insert(sb.length(),sb.charAt(0));
        sb.insert(sb.length() - 1,sb.charAt(1));
        sb.insert(sb.length() - 2,sb.charAt(2));
Answer 1

Вот что получилось у меня:

public class Polindrom {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("abcded");
        strings.add("abcde");
        strings.add("abcd");
        strings.add("abc");
        strings.add("ab");
        for (String string : strings) {
            System.out.println(string + " -> " + makeAPolindrom(string));
        }
    }
    public static String makeAPolindrom(String word) {
        StringBuilder result = new StringBuilder(word);
        StringBuilder reversed = new StringBuilder(word).reverse();
        for (int i = 0; i < word.length() - 1; i++) {
            if (!word.substring(i).equals(reversed.toString())) {
                result.insert(result.length() - i, word.charAt(i));
                reversed.deleteCharAt(reversed.length() - 1);
            } else if (word.length() - i <= 3) {
                break;
            }
        }
        return result.toString();
    }
}

Результат вывода в консоль:

abcded -> abcdedcba
abcde -> abcdedcba
abcd -> abcdcba
abc -> abcba
ab -> aba
READ ALSO
Как работает &lt;? extends SomeClass&gt; в Map&lt;K,V&gt;?

Как работает <? extends SomeClass> в Map<K,V>?

Есть два класса EJPlayer (Интерфейс) и EPlayer (Дочерний)

104
Программа не работает. В чем ошибка? [закрыт]

Программа не работает. В чем ошибка? [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

177
Простой Junit test для метода в Java

Простой Junit test для метода в Java

Только начинаю постигать полезности тестированияПеречитал много ответов здесь и в гугле в целом, но ответа не нашел

192
SQLite + Hibernate

SQLite + Hibernate

Не получается задать относительный путьПосле создания артефакта (IDEA) при открытии сессии выводит ошибку: javax

76