Строковые мини-задачи: разворот, анаграммы, палиндром

Разбираем мини-задачи про строки, которые почти гарантированно дадут на интервью.

Главная идея: в Python большинство строковых задач решается срезами и встроенными функциями в одну-две строки — знать эти идиомы важнее, чем писать циклы вручную.

Задача 1: перевернуть строку

Чёткий ответ. Срез s[::-1] с шагом -1 переворачивает любую последовательность. Это идиоматичнее и быстрее цикла.

s = "Привет"
print(s[::-1])

# почему работает: [начало:конец:шаг], шаг -1 идёт с конца
print("abcde"[::-1])

Вывод:

тевирП
edcba

Задача 2: проверить анаграмму

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

def is_anagram(a, b):
    return sorted(a) == sorted(b)

print(is_anagram("listen", "silent"))
print(is_anagram("hello", "world"))

# вариант через Counter — O(n) вместо O(n log n)
from collections import Counter
def is_anagram_fast(a, b):
    return Counter(a) == Counter(b)
print(is_anagram_fast("table", "bleat"))

Вывод:

True
False
True

Сортировка даёт O(n log n), а сравнение CounterO(n). На интервью стоит упомянуть оба и пояснить разницу в сложности.

Задача 3: палиндром

Палиндром читается одинаково с обеих сторон. Сравниваем строку с её разворотом — снова срез [::-1].

def is_palindrome(s):
    s = s.lower().replace(" ", "")
    return s == s[::-1]

print(is_palindrome("Аргентина манит негра"))
print(is_palindrome("привет"))

Вывод:

True
False

Задача 4: первый неповторяющийся символ

Ещё одна классика: найти первый символ, который встречается ровно один раз. Наивное решение перебирало бы для каждого символа всю строку (O(n²)). Правильный приём — за один проход посчитать все частоты через Counter, а потом пройти строку и вернуть первый символ с частотой 1. Получается O(n).

from collections import Counter

def first_unique(s):
    counts = Counter(s)          # один проход: частоты всех символов
    for ch in s:                 # второй проход: ищем первый уникальный
        if counts[ch] == 1:
            return ch
    return None

print(first_unique("swiss"))
print(first_unique("aabbcc"))

Вывод:

w
None

Здесь важно объяснить интервьюеру именно сложность: два линейных прохода вместо вложенного цикла. Это типичный пример, где знание Counter превращает O(n²) в O(n).

Итог

  • Разворот: s[::-1] — срез с шагом −1.
  • Анаграмма: sorted(a) == sorted(b) (O(n log n)) или Counter(a) == Counter(b) (O(n)).
  • Палиндром: сравнение строки с её разворотом после нормализации.
  • Первый уникальный символ: два прохода с Counter дают O(n) вместо O(n²).
Проверьте себя
1. Как перевернуть строку s в Python?
As.reverse()
Breversed(s)
Cs[::-1]
Ds.flip()
2. Какой способ проверки анаграммы быстрее по сложности?
Asorted(a) == sorted(b) — O(n log n)
BCounter(a) == Counter(b) — O(n)
CОни одинаковы
DЧерез два вложенных цикла
3. Как проверить, что строка — палиндром?
Alen(s) % 2 == 0
Bs == s[::-1] после нормализации
Cs.isalpha()
Dsorted(s) == s
Поддержать проект