КАК НАЙТИ САМУЮ ДЛИННУЮ ПОДСТРОКУ В СТРОКЕ 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

BLGPG-2397A3BB288F-24-11-24-00

Новые материалы: