КАК НАЙТИ САМУЮ ДЛИННУЮ ПОДСТРОКУ В СТРОКЕ PYTHON
Для поиска самой длинной подстроки в строке Python можно использовать несколько подходов. Один из таких подходов - это использование вложенных циклов для перебора всех возможных подстрок и сравнения их длин. Например:
max_length = 0
longest_substring = ""
for i in range(len(string)):
for j in range(i+1, len(string)+1):
substring = string[i:j]
if len(substring) > max_length:
max_length = len(substring)
longest_substring = substring
print(longest_substring)
В этом коде мы используем переменную max_length для хранения максимальной длины подстроки, которую мы нашли до этого момента, и переменную longest_substring для хранения самой длинной подстроки. Мы перебираем все возможные комбинации начального и конечного индексов подстроки, используя два вложенных цикла. Затем мы проверяем длину текущей подстроки и обновляем значения переменных max_length и longest_substring, если текущая подстрока оказывается длиннее, чем предыдущие.
Однако этот способ не является самым эффективным, когда речь идет о быстродействии. Более быстрый способ состоит в использовании алгоритма Манакера (алгоритма нахождения самого длинного палиндрома)
Алгоритм Манакера может быть использован для поиска самой длинной подстроки в строке не только палиндромов. Этот алгоритм работает за линейное время, что делает его гораздо быстрее, чем перебор всех подстрок.
Вот пример кода реализации алгоритма Манакера для поиска самой длинной не-палиндромной подстроки в строке:
def manacher(s):
s = '#' + '#'.join(s) + '#'
P = [0] * len(s)
center = right = 0
max_len = start = 0
for i in range(len(s)):
if i < right:
P[i] = min(right - i, P[2 * center - i])
while i - P[i] - 1 >= 0 and i + P[i] + 1 < len(s) and s[i - P[i] - 1] == s[i + P[i] + 1]:
P[i] += 1
if i + P[i] > right:
center, right = i, i + P[i]
if P[i] > max_len:
max_len, start = P[i], (i - P[i]) // 2
return s[start:start + max_len]
string = "Programming in Python is awesome"
longest_substring = manacher(string)
print(longest_substring)
Здесь мы используем функцию manacher, которая принимает строку и возвращает самую длинную не-палиндромную подстроку в этой строке. Мы начинаем с добавления символа-разделителя "#" между всеми буквами строки, чтобы работать с нечетной длиной палиндромов. Затем мы создаем список P, чтобы хранить длины палиндромов для каждого символа. Мы начинаем с центра строки и расширяем палиндром на обе стороны, проверяя, что следующие символы равны. Затем мы обновляем значения переменных center и right, если текущий палиндром длиннее, чем предыдущие. Наконец, мы возвращаем самую длинную не-палиндромную подстроку, используя P и исходную строку.
9 Cтроки и операции над ними Python
#8.1 Всё о строках в Python. Как обрезать, найти подстроку, длинна строки. str() питон
Уроки Python / Как найти символ в строке
Решение задачи \
МИТАП \
Задача из Собеседования на 160,000 Евро в Год
Как найти максимальный элемент в списке Python
Новые материалы:
- Асинхронная очередь python
- Пагинация telebot python
- Индекс второго вхождения python
- Что такое атрибут класса в python
- Диагональная матрица numpy
- Парсинг логов python
- Как проверить авторизован ли пользователь django
- Прототип функции python
- Python удалить все файлы в папке
- Lxml python скачать
- Pynput python документация