Проверка палиндрома
Условие
Напишите функцию, которая определяет, является ли заданная строка палиндромом. Палиндром - это строка, которая одинаково читается слева направо и справа налево.
Пример
Вход: "radar" Выход: true
Вход: "hello" Выход: false
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Проверка палиндрома
Описание задачи
Требуется реализовать функцию для определения, является ли строка палиндромом (palindrome). Палиндром — это строка, которая читается одинаково в обе стороны: как слева направо, так и справа налево. Проверка палиндромов — частая задача в алгоритмическом тестировании и валидации данных, особенно при работе с пользовательским вводом и обработкой текста.
Решение на Python
def is_palindrome(s):
"""
Проверяет, является ли строка палиндромом.
Args:
s: проверяемая строка
Returns:
True, если строка палиндром, False иначе
"""
# Очищаем строку: удаляем пробелы и приводим к нижнему регистру
cleaned = s.replace(' ', '').lower()
return cleaned == cleaned[::-1]
Альтернативные подходы
1. Использование двух указателей
def is_palindrome(s):
"""
Проверка с использованием двух указателей (левый и правый).
Более эффективно по памяти, чем создание новой строки.
"""
cleaned = s.replace(' ', '').lower()
left, right = 0, len(cleaned) - 1
while left < right:
if cleaned[left] != cleaned[right]:
return False
left += 1
right -= 1
return True
2. Рекурсивный подход
def is_palindrome(s):
"""
Рекурсивная проверка палиндрома.
"""
cleaned = s.replace(' ', '').lower()
def check(left, right):
if left >= right:
return True
if cleaned[left] != cleaned[right]:
return False
return check(left + 1, right - 1)
return check(0, len(cleaned) - 1)
3. С учётом спецсимволов и цифр
def is_palindrome_strict(s):
"""
Проверка палиндрома с игнорированием всех небуквенных символов.
Полезно для тестирования реальных текстов.
"""
import re
# Оставляем только буквы и цифры
cleaned = re.sub(r'[^a-z0-9]', '', s.lower())
return cleaned == cleaned[::-1]
4. На уровне символов (без создания новой строки)
def is_palindrome_optimized(s):
"""
Оптимизированный вариант с минимальной памятью.
"""
left, right = 0, len(s) - 1
while left < right:
# Пропускаем пробелы
if s[left].isspace():
left += 1
continue
if s[right].isspace():
right -= 1
continue
# Сравниваем символы без учёта регистра
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
Тестовые примеры
import unittest
class TestIsPalindrome(unittest.TestCase):
def test_basic_palindrome(self):
# Базовый случай из условия
assert is_palindrome('radar') == True
def test_not_palindrome(self):
# Не палиндром
assert is_palindrome('hello') == False
def test_single_char(self):
# Одиночный символ — палиндром
assert is_palindrome('a') == True
def test_empty_string(self):
# Пустая строка — палиндром
assert is_palindrome('') == True
def test_two_same_chars(self):
assert is_palindrome('aa') == True
def test_two_different_chars(self):
assert is_palindrome('ab') == False
def test_with_spaces(self):
# Палиндром с пробелами
assert is_palindrome('race car') == True
def test_case_insensitive(self):
# Проверка игнорирования регистра
assert is_palindrome('RaDaR') == True
def test_longer_palindrome(self):
assert is_palindrome('A man a plan a canal Panama') == True
def test_numbers(self):
assert is_palindrome('12321') == True
Анализ сложности
| Подход | Временная сложность | Пространственная сложность | Примечание |
|---|---|---|---|
| Слайсинг | O(n) | O(n) | Создаёт новую строку |
| Два указателя | O(n) | O(n) | Оптимальный вариант |
| Рекурсия | O(n) | O(n) | Плюс стек вызовов |
| С regex | O(n) | O(n) | Немного медленнее |
Применение в QA Automation
- Валидация пользовательского ввода — проверка, не вводит ли пользователь палиндромы вместо паролей
- Тестирование обработки строк — проверка корректности алгоритмов, работающих со строками
- Edge cases — палиндромы — частые граничные случаи для тестирования
- Генерация тестовых данных — автоматическое создание наборов для тестирования
Рекомендация
Для стандартного использования рекомендуется метод слайсинга — он самый читаемый и понятный. Для интервью и демонстрации понимания алгоритмов используйте подход с двумя указателями, так как он показывает глубокое понимание оптимизаций памяти.