1. Введение
В этой статье мы увидим, как мы можем проверить, является ли данная строка
палиндромом, используя Java.
Палиндром — это слово, фраза, число или другие последовательности символов, которые читаются так же, как в прямом , так и в обратном порядке, например, «мадам» или «гоночная машина».
2. Решения
В следующих разделах мы рассмотрим различные способы проверки того, является ли данная строка
палиндромом или нет.
2.1. Простой подход
Мы можем одновременно начать итерацию заданной строки
вперед и назад, по одному символу за раз. Если есть совпадение, цикл продолжается; в противном случае цикл завершается:
public boolean isPalindrome(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
int length = clean.length();
int forward = 0;
int backward = length - 1;
while (backward > forward) {
char forwardChar = clean.charAt(forward++);
char backwardChar = clean.charAt(backward--);
if (forwardChar != backwardChar)
return false;
}
return true;
}
2.2. Реверс строки
Есть несколько различных реализаций, которые подходят для этого варианта использования: мы можем использовать методы API из классов StringBuilder
и StringBuffer
при проверке палиндромов или мы можем обратить String
без этих классов.
Давайте сначала посмотрим на реализации кода без вспомогательных API:
public boolean isPalindromeReverseTheString(String text) {
StringBuilder reverse = new StringBuilder();
String clean = text.replaceAll("\\s+", "").toLowerCase();
char[] plain = clean.toCharArray();
for (int i = plain.length - 1; i >= 0; i--) {
reverse.append(plain[i]);
}
return (reverse.toString()).equals(clean);
}
В приведенном выше фрагменте мы просто повторяем заданную строку
от последнего символа и добавляем каждый символ к следующему символу, вплоть до первого символа, тем самым изменяя заданную строку.
Наконец, мы проверяем равенство между заданной строкой
и перевернутой строкой.
Такого же поведения можно добиться с помощью методов API.
Давайте посмотрим быструю демонстрацию:
public boolean isPalindromeUsingStringBuilder(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuilder plain = new StringBuilder(clean);
StringBuilder reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
public boolean isPalindromeUsingStringBuffer(String text) {
String clean = text.replaceAll("\\s+", "").toLowerCase();
StringBuffer plain = new StringBuffer(clean);
StringBuffer reverse = plain.reverse();
return (reverse.toString()).equals(clean);
}
Во фрагменте кода мы вызываем метод reverse()
из API StringBuilder
и StringBuffer
, чтобы перевернуть заданную строку
и проверить ее на равенство.
2.3. Использование потокового
API
Мы также можем использовать IntStream
для предоставления решения:
public boolean isPalindromeUsingIntStream(String text) {
String temp = text.replaceAll("\\s+", "").toLowerCase();
return IntStream.range(0, temp.length() / 2)
.noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1));
}
В приведенном выше фрагменте мы проверяем, что ни одна из пар символов с каждого конца строки
не соответствует условию Predicate .
2.4. Использование рекурсии
Рекурсия — очень популярный метод решения подобных задач. В продемонстрированном примере мы рекурсивно перебираем заданную строку
и проверяем, является ли она палиндромом или нет:
public boolean isPalindromeRecursive(String text){
String clean = text.replaceAll("\\s+", "").toLowerCase();
return recursivePalindrome(clean,0,clean.length()-1);
}
private boolean recursivePalindrome(String text, int forward, int backward) {
if (forward == backward) {
return true;
}
if ((text.charAt(forward)) != (text.charAt(backward))) {
return false;
}
if (forward < backward + 1) {
return recursivePalindrome(text, forward + 1, backward - 1);
}
return true;
}
3. Заключение
В этом кратком руководстве мы увидели, как узнать, является ли данная строка
палиндромом или нет.
Как всегда, примеры кода для этой статьи доступны на GitHub .