Поиск самых длинных подстрок python

Привет, я новичок в программировании на python. У меня есть задача, которая требует от меня найти самые длинные подстроки. У меня есть некоторые записанные, которые выводят самую длинную подстроку, но мне нужно, чтобы она выводила две самые длинные подстроки.

def sequences(nums):
   pos1=0
   pos2=1
   seq1=0
   seq2=1

        while pos2<len(nums):
    
            if nums[pos2] != nums[(pos2-1)]:
               if seq2 - seq1 < pos2 - pos1:
                    seq1, seq2 = pos1, pos2
               pos1=pos2
            pos2+=1
    
        if seq2 - seq1 < pos2 - pos1:
          seq1, seq2 = pos1, pos2
        return nums[seq1:seq2]
    
    
seq3=sequences
print(seq3('10111000'))`

Например: «10111000» прямо сейчас все, что я получаю, это 111, но я также хотел бы, чтобы он выводил 000, а я пытался найти способ сделать это, но, похоже, не могу его взломать, я был бы очень признателен за вашу помощь Спасибо

Ваше описание непонятно. Самой длинной подстрокой некоторой строки является сама строка. Но из ваших примеров похоже, что вам нужны только подстроки, состоящие из одного символа. Это верно? Если да, то нужно об этом сказать. Будь понятен.

Tom Karzes 10.01.2023 11:55

Приведите примеры вашего ввода и ожидаемого результата

ksbg 10.01.2023 11:55

Если вы хотите вывести все односимвольные подстроки максимальной длины, вам нужно собрать их в список (или какой-либо другой набор элементов). В настоящее время вы просто возвращаете часть входной строки.

Simon Lundberg 10.01.2023 11:57

Нет, я пытаюсь заставить его выводить две хартии, например, 111 и 000, но я не знаю, как это реализовать в коде.

GGANGG 10.01.2023 11:58

Ввод: aaabbbabaabb вывод: aaa ожидаемый вывод: aaa bbb я знаю, что я записал, не может вывести то, что я хочу, но именно поэтому я поместил код здесь, чтобы я мог получить указатели, потому что я новичок в кодировании Python, я пытался думать что добавить, чтобы получить ожидаемый результат, мне не удалось

GGANGG 10.01.2023 12:07

Вы ожидаете, что на выходе будет строка "aaa bbb" или вы ожидаете, что это будут две строки в списке: ["aaa", "bbb"]?

Simon Lundberg 10.01.2023 12:07

Две строки в списке

GGANGG 10.01.2023 12:11
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
3
7
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Самый простой способ сделать это, вероятно, использовать регулярное выражение для поиска повторяющихся последовательностей всех символов:

import re

def longest_substrings(input: str):
    # get all unique characters in the input string
    chars = set(input)

    # initialise max_length to zero
    max_length = 0

    # empty list to store output
    output = []

    # loop over all characters in the string
    for c in chars:
        # find all substrings of any length
        # matching *only* that character
        substrings = re.findall(f"{c}+", input)

        # loop over all substrings
        for substring in substrings:
            # check the length of the substring
            length = len(substring)

            # if longer than the previous max_length,
            # we replace the output list with just this
            # substring
            if length > max_length:
                output = [substring, ]
                max_length = length
            # if length is equal, we add this substring
            # to the output
            elif length == max_length:
                output.append(substring)

            # implicitly: if the length is less, we do
            # nothing

    return output

print(longest_substrings("1100111100111101100100001101"))
# ['1111', '1111', '0000']

F"{c}+" — это шаблон регулярного выражения, который превращается в 0+ вместо 0 и в 1+ вместо 1. + означает match one or more repeating occurrences of this character.

Привет, я пытаюсь заставить его вывести что-то еще, когда оно меньше, но выводит нулевой набор, как мне это изменить

GGANGG 10.01.2023 13:33

Выводить что вместо этого? Опишите логику, которую вы пытаетесь реализовать.

Simon Lundberg 10.01.2023 13:41

Я пытаюсь добавить условие, которое говорит, что если длина последовательности меньше 2, она печатает не больше 2, что я сделал, и это работает, так что спасибо

GGANGG 10.01.2023 13:52
Ответ принят как подходящий

Я хотел бы предложить другое решение, используя groupby:

def longest_substrings(input: str):

    substring_generator = ("".join(g) for _, g in groupby(input))
    sorted_substrings = sorted(substring_generator, key=lambda x: -len(x))
    result = [list(g) for k, g in groupby(sorted_substrings, key=lambda x: len(x))][0]
    return result

print(longest_substrings("1100111100111101100100001101"))

Выход: ['1111', '1111', '0000']

В основном, что я делаю здесь, это следующее:

Сначала я группирую входную строку. Это означает, что группы будут создаваться для каждого последовательного похожего элемента, например, 111 или 00. -> substring_generator

Это я сортирую по убыванию по длине строк. -> sorted_substrings

Этот отсортированный список я снова группирую по длинам строк и затем беру из него первый элемент. -> result.

Результат должен быть именно тем, о чем вы просили, и я думаю, что это очень читабельно и понятно, что происходит.

Другие вопросы по теме