2. Проверить, является ли строка палиндромом? #
"A man, a plan, a canal, Panama!"
Спойлеры к решению
Подсказки
- Палиндром — это строка, которая читается одинаково как слева направо, так и справа налево.
- Нужно учесть, что пробелы, знаки препинания и регистр символов не имеют значения при проверке.
- Можно использовать два указателя: один с начала строки, другой с конца, и проверять, совпадают ли символы, игнорируя пробелы и знаки препинания.
Решение
Для решения задачи можно использовать регулярные выражения для удаления всего, что не является буквами или цифрами, а затем сравнить строку с её обратной версией.
class Main {
public static void main(String[] args) {
String text = "A man, a plan, a canal, Panama!";
// Преобразуем строку в нижний регистр и удаляем все ненужные символы
String cleanedText = text.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
// Проверяем, равна ли строка своему обратному представлению
if (isPalindrome(cleanedText)) {
System.out.println("Строка является палиндромом");
} else {
System.out.println("Строка не является палиндромом");
}
}
// Метод для проверки, является ли строка палиндромом
public static 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;
}
}
Что делает код:
- Мы убираем все символы, которые не являются буквами или цифрами, с помощью регулярного выражения
replaceAll("[^a-zA-Z0-9]", "")
. - Преобразуем строку в нижний регистр, чтобы игнорировать регистр.
- Метод
isPalindrome
проверяет, совпадают ли символы с обеих сторон строки (сначала и с конца).
Результат для строки "A man, a plan, a canal, Panama!"
:
Строка является палиндромом
Палиндром проверен успешно, так как после очистки и приведения к единому регистру строка становится "amanaplanacanalpanama"
, которая читается одинаково в обоих направлениях. ✅