72. Проверка палиндрома в цикле без методов строк #
Написать функцию для проверки палиндрома, обрабатывая строку только в циклах. Нельзя использовать replace(), trim() и другие методы для обработки строк. Нужно игнорировать пробелы и проверять только буквы/символы.
Спойлеры к решению
Подсказки
💡 Используйте два указателя: один с начала, другой с конца строки
💡 Пропускайте пробелы, перемещая указатели внутрь строки
💡 Сравнивайте символы, игнорируя регистр (Character.toLowerCase())
💡 Продолжайте до тех пор, пока указатели не встретятся
💡 Проверяйте, что символы совпадают на каждой итерации
💡 Обработайте случай, когда строка состоит только из пробелов
💡 Пропускайте пробелы, перемещая указатели внутрь строки
💡 Сравнивайте символы, игнорируя регистр (Character.toLowerCase())
💡 Продолжайте до тех пор, пока указатели не встретятся
💡 Проверяйте, что символы совпадают на каждой итерации
💡 Обработайте случай, когда строка состоит только из пробелов
Решение
public class PalindromeChecker {
public static boolean isPalindrome(String s) {
if (s == null) return false;
int left = 0;
int right = s.length() - 1;
boolean foundValidChars = false;
while (left <= right) {
// Пропускаем пробелы слева
while (left <= right && s.charAt(left) == ' ') {
left++;
}
// Пропускаем пробелы справа
while (left <= right && s.charAt(right) == ' ') {
right--;
}
// Если после пропуска пробелов не осталось символов
if (left > right) {
return foundValidChars;
}
// Отмечаем, что нашли хотя бы одну пару символов для сравнения
foundValidChars = true;
// Сравниваем символы (игнорируя регистр)
char leftChar = Character.toLowerCase(s.charAt(left));
char rightChar = Character.toLowerCase(s.charAt(right));
if (leftChar != rightChar) {
return false;
}
// Перемещаем указатели
left++;
right--;
}
return true;
}
public static void main(String[] args) {
// Тестовые случаи из задания
System.out.println(isPalindrome(" fly me to the moon ")); // false
System.out.println(isPalindrome(" сел в озере березов лес ")); // true
// Дополнительные тесты
System.out.println(isPalindrome("а роза упала на лапу азора")); // true
System.out.println(isPalindrome("hello world")); // false
System.out.println(isPalindrome("a")); // true
System.out.println(isPalindrome(" ")); // false (только пробелы)
System.out.println(isPalindrome("")); // false (пустая строка)
}
}
Алгоритм по шагам:
- Инициализация указателей -
left
с начала (0),right
с конца (длина - 1) - Пропуск пробелов - двигаем указатели мимо пробелов с обеих сторон
- Проверка окончания - если указатели пересеклись, возвращаем результат
- Сравнение символов - приводим к нижнему регистру и сравниваем
- Несовпадение - возвращаем false при первой ошибке
- Движение к центру - сдвигаем указатели и повторяем
Особенности решения:
- Работает с любым количеством пробелов
- Игнорирует регистр букв
- Корректно обрабатывает строки только из пробелов (возвращает false)
- Эффективно использует память (O(1) дополнительной памяти)
- Временная сложность O(n)
Результаты для тестовых случаев:
" fly me to the moon "
→ false (не палиндром)" сел в озере березов лес "
→ true (палиндром)