@n3dimo4ka

Задача на декомпрессию строки. Почему код проходит не все тесты?

Здравствуйте! Нужна помощь с пониманием задачи. Задача:

Дана строка, состоящая из букв латинского алфавита. В целях ее компрессии разрешается любые ее непустые подстроки (подстрокой называется последовательность идущих подряд символов строки) сжимать по следующему правилу. Строка A, состоящая из повторений некоторой непустой строки B, записывается как символ «(», затем количество повторений (целое число от 1 до 105, записанное без ведущих нулей), затем строка B, и, наконец, символ «)». Например, строку ababab можно сжать, записав ее как (3ab).

В данной задаче допускается повторное сжатие подстрок строки. Разумеется, можно сжимать лишь части, состоящие только из букв латинского алфавита. Например, строку acacacaacacaca можно сжать, записав ее в виде (2acacaca), и осуществить дальнейшую компрессию: (2(3ac)a).

Ваша задача осуществить обратное преобразование, то есть преобразовать строку из сжатого вида в несжатый.

Входные данные

Во входном файле записана непустая строка в сжатом виде. Длина строки не превосходит 1000 символов.
Выходные данные

Выведите результат декомпрессии строки. Гарантируется, что длина ответа не превосходит 105 символов. Заметим, что в результате декомпрессии длина строки может уменьшиться.

У меня вопрос по поводу условия о уменьшении длины в результате декомпрессии. Когда такое может быть?

Так же я написал код, но он проходит не все тесты:
string = input()
#(3(2aba)) > (3abaaba) > (abaabaabaabaabaaba)
 
latest_close = string.rfind(')')
first_close = string.find(')')
latest_start = string.rfind('(')
 
def find_cnt(s):
    i = 0
    digit = ''
    while s[i].isdigit():
        digit += s[i]
        i += 1
    repeat = s[i:]
    return int(digit), repeat
 
 
 
while string.rfind(')') != -1:
    count, repeat = find_cnt(string[latest_start+1:first_close])
    repeated = ''
    for _ in range(count):
        repeated += repeat
    new_string = string[:latest_start] + repeated + string[first_close + 1:]
    string = new_string
 
    latest_close = string.rfind(')')
    first_close = string.find(')')
    latest_start = string.rfind('(')
 
print(string)

Прошу помощи в данных вопросах. Спасибо.
  • Вопрос задан
  • 1855 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
К чему такие сложности
import re

def decode(encoded):
    def repl(m): return m.group(2) * int(m.group(1))
    reg = re.compile('\((\d+)(\w+)\)')
    while True:
        decoded = reg.sub(repl, encoded)
        if decoded == encoded:
            return decoded
        encoded = decoded 
        
assert decode('(2(3ac)a)') == 'acacacaacacaca'
assert decode('(3(2aba))') == 'abaabaabaabaabaaba'
assert decode('(3a)') == 'aaa'  # уменьшение длины
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы