← Назад к вопросам

Проверка палиндрома

2.0 Middle🔥 201 комментариев
#Теория тестирования

Условие

Напишите функцию, которая определяет, является ли заданная строка палиндромом. Палиндром - это строка, которая одинаково читается слева направо и справа налево.

Пример

Вход: "radar" Выход: true

Вход: "hello" Выход: false

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Проверка палиндрома

Описание задачи

Требуется реализовать функцию для определения, является ли строка палиндромом (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)Плюс стек вызовов
С regexO(n)O(n)Немного медленнее

Применение в QA Automation

  • Валидация пользовательского ввода — проверка, не вводит ли пользователь палиндромы вместо паролей
  • Тестирование обработки строк — проверка корректности алгоритмов, работающих со строками
  • Edge cases — палиндромы — частые граничные случаи для тестирования
  • Генерация тестовых данных — автоматическое создание наборов для тестирования

Рекомендация

Для стандартного использования рекомендуется метод слайсинга — он самый читаемый и понятный. Для интервью и демонстрации понимания алгоритмов используйте подход с двумя указателями, так как он показывает глубокое понимание оптимизаций памяти.

Проверка палиндрома | PrepBro