Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить, является ли строка палиндромом

Короткий ответ

Палиндром читается одинаково слева направо и справа налево. Сравните строку с её перевёрнутой копией:

void main() {
    String word = "level";
    boolean palindrome = word.equals(new StringBuilder(word).reverse().toString());
 
    IO.println(palindrome);
}

Результат:

true

Два указателя

Без лишней строки: сравнивайте символы с двух концов и двигайтесь к середине:

boolean isPalindrome(String text) {
    int left = 0;
    int right = text.length() - 1;
    while (left < right) {
        if (text.charAt(left) != text.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}
 
void main() {
    IO.println(isPalindrome("racecar"));
    IO.println(isPalindrome("java"));
}

Результат:

true
false

Фраза

Для фраз уберите всё, кроме букв и цифр, и приведите к одному регистру:

void main() {
    String phrase = "A man, a plan, a canal: Panama";
    String clean = phrase.replaceAll("[^\\p{L}\\p{N}]", "").toLowerCase();
 
    IO.println(clean);
    IO.println(clean.equals(new StringBuilder(clean).reverse().toString()));
}

Результат:

amanaplanacanalpanama
true

Частая ошибка

Сравнить строки через ==. Перевёрнутая строка — новый объект, поэтому результат всегда false:

void main() {
    String word = "level";
    String reversed = new StringBuilder(word).reverse().toString();
 
    IO.println(word == reversed);
    IO.println(word.equals(reversed));
}

Результат:

false
true

Функции из этого ответа

  • StringBuilder.reverse() — Переворачивает содержимое StringBuilder задом наперёд.
  • String.charAt() — Возвращает символ строки по индексу.
  • String.replaceAll() — Заменяет все совпадения регулярного выражения.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.