Как проверить, является ли строка палиндромом
Короткий ответ
Палиндром читается одинаково слева направо и справа налево. Сравните строку с её перевёрнутой копией:
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() — Заменяет все совпадения регулярного выражения.