По заданной строке str найдите длину самой длинной подстроки без повторяющихся символов.
- Для «ABDEFGABEF» самой длинной подстрокой являются «BDEFGA» и «DEFGAB» длиной 6.
- Для «BBBB» самая длинная подстрока — «B» длиной 1.
- Для «GEEKSFORGEEKS» есть две самые длинные подстроки, показанные на диаграммах ниже, длиной 7
,


Требуемая временная сложность составляет O (n), где n — длина строки.
Метод 1 (простой) : Мы можем рассмотреть все подстроки одну за другой и проверить для каждой подстроки, содержит ли она все уникальные символы или нет. Там будет n * (n + 1) / 2 подстроки. Независимо от того, содержит ли подстрока все уникальные символы или нет, ее можно проверить за линейное время, отсканировав ее слева направо и сохранив карту посещенных символов. Временная сложность этого решения будет O (n ^ 3).
Метод 2 (линейное время) : давайте поговорим о решении линейного времени сейчас. Это решение использует дополнительное пространство для хранения последних индексов уже посещенных символов. Идея состоит в том, чтобы сканировать строку слева направо, отслеживая максимальную длину неповторяющейся символьной подстроки ( NRCS ), наблюдаемой до сих пор. Пусть максимальная длина будет max_len. Когда мы пересекаем строку, мы также отслеживаем длину текущей NRCS, используя переменную cur_len. Для каждого нового символа мы ищем его в уже обработанной части строки (для этой цели используется временный массив с именем visit []). Если его нет, то мы увеличиваем cur_len на 1. Если есть, то есть два случая:
- Предыдущий экземпляр символа не является частью текущей NRCS (NRCS, которая находится в процессе). В этом случае нам нужно просто увеличить cur_len на 1.
- Если предыдущий экземпляр является частью текущей NRCS, то наша текущая NRCS изменится. Он становится подстрокой, начиная со следующего символа предыдущего экземпляра и заканчивая текущим сканированным символом. Нам также нужно сравнить cur_len и max_len, прежде чем менять текущую NRCS (или менять cur_len).
Ниже приведена реализация вышеуказанного подхода:
|
С
|
Джава
|
питон
|
C #
|
Выход
The input string is ABDEFGABEF The length of the longest non-repeating character substring is 6
Сложность времени: O (n + d), где n — длина входной строки, а d — количество символов в алфавите входной строки. Например, если строка состоит из строчных букв английского алфавита, то значение d равно 26.
Вспомогательное пространство: O (d)
В качестве упражнения попробуйте модифицированную версию вышеуказанной задачи, где вам также необходимо напечатать NRCS максимальной длины (вышеуказанная программа печатает только ее длину).
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Печать самой длинной подстроки без повторяющихся символов
- Самая длинная повторяющаяся и не перекрывающаяся подстрока
- Самая длинная подстрока такая, что никакие три последовательных символа не совпадают
- Самая длинная подстрока из 4-х первых N символов бесконечной строки
- Подстрока максимальной длины, имеющая все одинаковые символы после k изменений
- Длина самой длинной подстроки с равными 1 и 0
- Длина самой длинной действующей подстроки
- Самая длинная четная подстрока, так что сумма первой и второй половины одинакова
- Длина самой длинной подстроки, не содержащей палиндрома
- Найдите самую длинную подстроку с k уникальными символами в данной строке
- Самая длинная подстрока с K уникальными символами с использованием бинарного поиска
- Подстрока минимальной длины с ровно K различными символами
- Длина самой длинной подстроки без последовательных одинаковых букв
- Найти длину самой длинной подпоследовательности одной строки, которая является подстрокой другой строки
- Длина наибольшей подстроки, которая имеет символ с частотой, большей или равной половине подстроки
0.00 (0%) 0 votes