вот мои реализации javascript и cpp с большими деталями: https://algorithm.pingzhang.io/String/longest_substring_without_repeating_characters.html
Мы хотим найти самую длинную подстроку без повторяющихся символов. Первое, что приходит мне в голову, это то, что нам нужна хеш-таблица для хранения каждого символа в подстроке, чтобы при появлении нового символа мы могли легко узнать, находится ли этот символ в подстроке или нет. Я называю это как valueIdxHash
. Тогда подстрока имеет startIdx
и endIdx
. Таким образом, нам нужна переменная для отслеживания начального индекса подстроки, и я называю ее startIdx
. Давайте предположим, что мы находимся в индексе i
, и у нас уже есть подстрока (startIdx, i - 1)
. Теперь мы хотим проверить, может ли эта подстрока продолжать расти или нет.
Если valueIdxHash
содержит str[i]
, это означает, что это повторяющийся символ. Но нам все еще нужно проверить, находится ли этот повторяющийся символ в подстроке (startIdx, i - 1)
. Таким образом, нам нужно извлечь индекс str[i]
, который появился в прошлый раз, и затем сравнить этот индекс с startIdx
.
- Если
startIdx
больше, это означает, что последнее появившееся str[i]
равно за пределами подстроки. Таким образом, подстрока может продолжать расти.
- Если
startIdx
меньше, это означает, что последнее появившееся str[i]
равно в пределах подстроки. Таким образом, подстрока больше не может расти. startIdx
будет обновлен как valueIdxHash[str[i]] + 1
, а новая подстрока (valueIdxHash[str[i]] + 1, i)
может продолжать расти.
Если valueIdxHash
не содержит str[i]
, подстрока может продолжать расти.