---
round: 1
ticket_no: 27
source_no: 6
slug: permutation-in-string
topic: Hash Table
difficulty: Medium
leetcode_id: 567
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 27 — Permutation in String

## Условие (как предъявлено)

Даны две строки `s1` и `s2`. Нужно проверить, содержит ли `s2` перестановку `s1` — то есть подстроку, являющуюся анаграммой `s1`.

```
Input:  s1 = "ab", s2 = "eidbaooo"   →  true    ("ba")
Input:  s1 = "ab", s2 = "eidboaoo"   →  false
```

Constraints: `1 <= length <= 10^4`.

## Ответ

> Здесь у нас двигается окно. Вот получается, посчитали сначала хэш анограммы, то есть каунтеры по каждому символу по нашей подстроке, а дальше считаем его для окна нашего текущего и сравниваем. Если совпало, все вернули трум. Если нет, тогда сдвигаем наше окно, и с движением этого окна мы получается счетчик один уменьшаем у элемента, который вышел из массива, прибавляем счетчик, который вошел в массив.

## Разбор

**Что верно:** окно длины |s1|, частотные счётчики, сравнение с эталоном и инкрементальное обновление при сдвиге; остановка на первом совпадении — верно.

**Что упущено и ошибки:** не названа сложность O(n); не назван быстрый выход при |s1| > |s2| → false; не упомянута оптимизация через счётчик совпавших позиций (diff), дающая строго O(1) на шаг; граничные случаи (|s1| = 1, s1 == s2).

**Эталонная идея:** массив 26 для s1, скользящее окно по s2 с инкрементальным обновлением; сравнение массивов либо счётчик расхождений.

**Сложность:** время O(n), память O(1)

**Критерии:** идея ✅ · структура данных ✅ · сложность ❌ · граничные случаи ⚠️


**Разбор задачи:** [`../../algo-solutions/01-must-have/02-hash-table/06-permutation-in-string.md`](../../algo-solutions/01-must-have/02-hash-table/06-permutation-in-string.md)
