время: O (n) (один проход)
пробел: O (k)
Вот как бы я это сделал:
Создайте хеш-таблицу для всех символов из строки Y. (Я предполагаю, что все символы различны в Y).
Первый проход:
Начните с первого символа строки X.
обновить хэш-таблицу, например: для ключа 'a' введите местоположение (скажем, 1).
Продолжайте, пока не получите все символы из Y (пока все ключи в хэш-таблице не будут иметь значения).
Если вы снова получили какой-либо символ, обновите его более новое значение и удалите более старый.
Получив первый проход, возьмите наименьшее значение из хеш-таблицы и наибольшее значение.
Это минимальное окно, наблюдаемое до сих пор.
Теперь перейдите к следующему символу в строке X, обновите хеш-таблицу и посмотрите, не уменьшилось ли у вас окно.
Редактировать:
Давайте рассмотрим пример:
Строка x = "coobdafceeaxab"
Строка y = "abc"
Сначала инициализируйте хеш-таблицу из символов Y.
ч [а] = -1
ч [б] = -1
ч [с] = -1
Теперь, начните с первого символа X.
Первый символ c, h [c] = 0
Второй символ (o) не является частью хэша, пропустите его.
..
Четвертый символ (b), h [b] = 3
..
Шестой символ (a), введите хеш-таблицу h [a] = 5.
Теперь все ключи из хеш-таблицы имеют некоторое значение.
Наименьшее значение равно 0 (от c), а наибольшее значение равно 5 (от a), минимальное окно до сих пор составляет 6 (от 0 до 5).
Первый проход сделан.
Возьмите следующий символ. f не является частью хеш-таблицы, пропустите ее.
Следующий символ (c), обновите хеш-таблицу h [c] = 7.
Найти новое окно, наименьшее значение равно 3 (из b), а наибольшее значение равно 7 (из c).
Новое окно от 3 до 7 => 5.
Продолжайте делать это до последнего символа строки X.
Надеюсь, теперь все ясно.
Редактировать
Есть некоторые опасения по поводу нахождения максимального и минимального значения из хеша.
Мы можем сохранить отсортированный список ссылок и сопоставить его с хэш-таблицей.
Всякий раз, когда изменяется какой-либо элемент из списка ссылок, он должен быть повторно сопоставлен с хэш-таблицей.
Обе эти операции O (1)
Общая площадь будет м + м
Редактировать
Вот небольшая визуализация вышеуказанной проблемы:
Для "coobdafceeaxab" и "abc"
шаг 0:
Начальный двусвязный список = NULL
Начальная хеш-таблица = NULL
шаг 1:
Голова <-> [с, 0] <-> хвост
h [c] = [0, 'указатель на узел c в LL']
шаг 2:
Голова <-> [с, 0] <-> [б, 3] <-> хвост
h [c] = [0, «указатель на узел c в LL»], h [b] = [3, «указатель на узел b в LL»],
Шаг 3:
Голова <-> [с, 0] <-> [б, 3] <-> [а, 5] <-> хвост
h [c] = [0, «указатель на узел c в LL»], h [b] = [3, «указатель на узел b в LL»], h [a] = [5, «указатель на узел в LL ']
Минимальное окно => отличие от хвоста и головы => (5-0) +1 => Длина: 6
Шаг 4:
Обновите запись C до индекса 7 здесь. (Удалить узел 'c' из связанного списка и добавить в конец)
Голова <-> [б, 3] <-> [а, 5] <-> [с, 7] <-> хвост
h [c] = [7, 'новый указатель на узел c в LL'], h [b] = [3, 'указатель на узел b в LL'], h [a] = [5, 'указатель на узел в LL '],
Минимальное окно => отличие от хвоста и головы => (7-3) +1 => Длина: 5
И так далее ..
Обратите внимание, что выше обновления связанного списка и обновления хэш-таблицы оба O (1).
Пожалуйста, поправьте меня, если я ошибаюсь ..
Описание:
Сложность времени: O (n) за один проход
Сложность пространства: O (k) где k - длина строки Y