1. Что такое палиндром?
Палиндром — это слово, фраза, число или любая другая последовательность единиц, которые могут читаться одинаково в обоих направлениях. Обычно, если они найдены, запятые, разделители или другие разделители слов игнорируются, но это не обязательное правило.
Аналогично, числа-палиндромы — это числа, которые представляют одно и то же число, если все цифры поменять местами(в больших числах, таких как 1_00_00_001, подчеркивания можно игнорировать). Подчеркивания в числовых литералах — это новое дополнение к возможностям Java 7.
2. Алгоритм
Общие шаги для проверки того, является ли указанная строка или число палиндромом, следующие:
- Сохраните исходную строку в переменной.
- Переверните строку и сохраните ее в другой переменной.
- Сравните обе переменные.
- Если обе строки равны, то строка является палиндромом.
- Если обе строки не равны, то строка не является палиндромом.
3. Программы-палиндромы Java
Чтобы проверить строку-палиндром, поменяйте местами символы строки. Теперь используйте метод equals() или equalsIgnoreCase(), чтобы проверить, является ли данная строка палиндромом или нет.
3.1. Переворачивая строку
Методы StringBuilder.reverse() и StringUtils.reverse() из Apache Common Lang могут отменить метод в одной строке.
public static boolean isPalindromeUsingStringBuilder(String originalString) {String reverse = new StringBuilder(originalString).reverse().toString();return originalString.equals(reverse);}public static boolean isPalindromeUsingStringUtils(String originalString) {String reverse = StringUtils.reverse(originalString);return originalString.equals(reverse);}
3.2 Использование цикла For
Используйте цикл for для получения обратной строки путем перебора символов строки из последнего индекса с помощью метода charAt() и создания новой строки.
Используйте этот подход только тогда, когда мы проверяем строку на палиндром без использования встроенных обратных методов.
public static boolean isPalindromeUsingForLoop(String originalString) {String reverse = "";for(int i = originalString.length() - 1; i >= 0; i--) {reverse = reverse + originalString.charAt(i);}return originalString.equals(reverse);}
3.3 Использование рекурсии
В рекурсии вместо создания новой строки, которая является обратной по отношению к исходной строке, мы можем сравнить символы заданной строки с начала и с конца.
Если символы на соответствующих позициях в начале и конце одинаковы, то строка является палиндромом.
public static boolean isPalindromeUsingRecursion(String string) {if(string.length() == 0 || string.length() == 1) {return true;}if(string.charAt(0) == string.charAt(string.length() - 1)) {return isPalindromeUsingRecursion(string.substring(1, string.length() - 1));}return false;}
4. Демонстрация
Давайте запустим все рассмотренные выше подходы и протестируем их результаты.
String input1 = "howtodoinjava";String input2 = "naman";isPalindromeUsingStringBuilder(input1); //falseisPalindromeUsingStringBuilder(input2); //trueisPalindromeUsingStringUtils(input1); //falseisPalindromeUsingStringUtils(input2); //trueisPalindromeUsingForLoop(input1); //falseisPalindromeUsingForLoop(input2); //trueisPalindromeUsingRecursion(input1); //falseisPalindromeUsingRecursion(input1); //true