Даны строки s и t. Проверьте, есть ли в s подстрока, которая является
анаграммой t — состоит из тех же символов в тех же количествах, но, возможно,
в другом порядке.
Символы могут быть любыми и заранее не известны. Решение LeetCode 567
(Permutation in String) с массивом [26]int и сравнением массивов на каждом шаге
здесь не засчитывается: алфавит не ограничен, и сравнивать все счётчики на
каждом шаге — это O(n·σ).
// HasAnagram сообщает, есть ли в s подстрока-анаграмма t.
func HasAnagram(s, t string) bool
Примеры
"mnmcnmmn", "mmn" → true // "mnm"
"gkw5wxy7zio", "yxz7" → true // "xy7z"
"abc", "abd" → false
"ab", "" → true // пустая строка — подстрока любой строки
Ограничения
0 ≤ len(s), len(t) ≤ 10⁶. Строки в UTF-8, символ — руна.
- Ожидается O(|s| + |t|) в среднем — независимо от размера алфавита.
Устно: как вернуть все позиции, где начинаются анаграммы (LeetCode 438)?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.