Суть задачи: дана строка. Из неё нужно сделать палиндром (когда слово читается одинаково и с начала и с конца) минимально возможной длины. Например, есть строка "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));
Вот что получилось у меня:
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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть два класса EJPlayer (Интерфейс) и EPlayer (Дочерний)
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Только начинаю постигать полезности тестированияПеречитал много ответов здесь и в гугле в целом, но ответа не нашел
Не получается задать относительный путьПосле создания артефакта (IDEA) при открытии сессии выводит ошибку: javax