В следующей задаче мне требовалось от полученной строки вычислить максимальную длину подстроки с уникальными символами.
Здесь наблюдается некоторое сходство в мышлении над задачей ,которую я описывал в teletype. Суть в том ,что я на каждой итерации обхода проверяю ,не было ли текущего символа в хешмапе. И если он есть ,я двигаю указатель left на значение из хешмапы по этому символу. В хешмапе ключи - это символы ,а значения - индексы ,на которых в последний раз встречался этот символ.
Далее максимальное значение подстроки вычисляется как максимум от последнего вычисленного максимума и текущей разницы между i (индексом текущей итерации) и указателем left.
Суть в том ,что каждый раз ,встречая символ ,который уже был ранее ,я как бы перестаю учитывать все то ,что было левее него ,включая его самого. Таким образом посредством указателей left и i формируется окно или отрезок ,который гарантировано содержит уникальные символы.
Но мое решение проходило не все тесты. Как оказалось недостаточно просто проверить наличие символа в хешмапе ,чтобы обновить указатель left. Нужно еще проверить ,чтобы он всегда двигался вправо! Ведь может быть ситуация ,когда символ стоял левее текущего указателя left ,и тогда логика нарушится. Этот момент я упустил ,а так мышление было в правильном направлении.
На задачу ушел 1 час ,и по правилам ,которые я себе придумал (уделять на честное решение не более часа) ,я прервал акт насилия над своим мозгом и полез в chatgpt спрашивать ,где у меня ошибка. В общем с одной стороны радует ,что изначально я сообразил общий алгоритм ,но не радует ,что упустил детали ,до которых не додумался даже после анализа упавших тестов. А когда получаешь подсказку ,вроде таким простым это кажется..
Вообще говоря ,тема хешей очень странно подана на яндексе. В теории по большому счету описывались алгоритмы построения хеш-функций. И только одна задача разбиралась в теории - 3-sum. Как мне кажется ,этого недостаточно ,чтобы подготовить к решению подобных задач. Я думаю ,что в теории должно разбираться больше задач из этой классификации ,а затем даваться примеры +- похожие на эти ,но требующие доработок или поданные под другими условиями ,где нужно разглядеть уже показанные в теории паттерны решений. А так как будто получается ,что кидают в воду ,чтобы научить плавать ,но бултыхайся сам как говорится. С одной стороны это побуждает разобраться в вопросе самому ,что хороший поинт для сеньора. С другой - зачем тогда курс. В общем пока с подсказками потихоньку решаются задачи.
Мы поможем вам ее достичь!
310 000
единомышленников
инструменты
для увлекательного достижения