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

#python-3.x #longest-substring

Вопрос:

Я пытался получить результат ниже из этой программы, но по какой-то причине она не дает требуемого результата.

Требуемые Результаты:

Input1 : bbaasssrppoccbaaacbaba Output1 : ['bbaa','sssrppoccbaaa','cba','ba']
Input2: hjgAvjhjKLhbfvbZSF Output2 :['h', 'jgA', 'vjh', 'jK', 'L', 'hb', 'f','vbZSF']

Что я получаю

Output: ['bbaa', 'sssrppoccbaaa', 'cba'] amp; Output: ['h', 'jgA', 'vjh', 'jK', 'L', 'hb', 'f'] снизу код, который не получает последнюю подстроку "ba" amp; "vbZSF" .

 s1 = 'bbaasssrppoccbaaacbaba'
# s1 = 'hjgAvjhjKLhbfvbZSF'


decSub = ''
listSub = []
i= 0

while i < len(s1):
    current = s1[i]
    previous = s1[i] if i == 0 else s1[i-1]
    if ord(current) <= ord(previous):
        decSub  = current
    else:
        listSub.append(decSub)

        decSub = ''
        decSub  = current
    i  =1
print(listSub)
 

Было бы здорово, если бы кто-нибудь мог предложить исправление или лучший способ достижения этого результата.Заранее спасибо

Ответ №1:

Вам просто нужно добавить недостающее decSub в список.

Обновленный Код:

 s1 = 'bbaasssrppoccbaaacbaba'
# s1 = 'hjgAvjhjKLhbfvbZSF'


decSub = ''
listSub = []
i= 0

while i < len(s1):
    current = s1[i]
    previous = s1[i] if i == 0 else s1[i-1]
    if ord(current) <= ord(previous):
        decSub  = current
    else:
        listSub.append(decSub)
        decSub = ''
        decSub  = current

    i  = 1

listSub.append(decSub)

print(listSub)
 

Выход:

 # s1 = 'bbaasssrppoccbaaacbaba'
['bbaa', 'sssrppoccbaaa', 'cba', 'ba']

# s1 = 'hjgAvjhjKLhbfvbZSF'
['h', 'jgA', 'vjh', 'jK', 'L', 'hb', 'f', 'vbZSF']
 

Комментарии:

1. Если это решит вашу проблему, пожалуйста, примите этот ответ и поднимите голос. 🙂

Ответ №2:

while цикл — лучший выбор для итераций без произвольных границ-в вашем случае for цикл, вероятно, является лучшим выбором.

Вместо этого попробуйте выполнить следующее:

 from typing import List

def split_special(txt: str) -> List[str]:
    if len(txt) == 0:
        return []
    res = [txt[0]]
    prev = ord(txt[0])
    for l in map(ord, txt[1:]):
        if prev >= l:
            res[-1]  = chr(l)
        else:
            res.append(chr(l))
        prev = l
    return res
 

Выходы:

 >>> print(Input1)

bbaasssrppoccbaaacbaba

>>> print(split_special(Input1))

['bbaa', 'sssrppoccbaaa', 'cba', 'ba']

>>> print(Input2)

hjgAvjhjKLhbfvbZSF

>>> print(split_special(Input2))

['h', 'jgA', 'vjh', 'jK', 'L', 'hb', 'f', 'vbZSF']
 

Комментарии:

1. Спасибо @Grzegorz, это более изысканно.