Я пытаюсь решить 394. Декодировать строку в Leetcode, это было мое решение (я знаю, что оно неэффективно):
class Solution:
def decodeString(self, s: str) -> str:
stack = []
for ch in s:
if ch != ']':
stack.append(ch)
else:
new_s = ''
while stack[-1] != '[':
new_s += stack.pop()
new_s = new_s[::-1]
stack.pop()
number = ''
while stack and stack[-1].isdigit():
print(stack[-1])
number += stack.pop()
number = int(number[::-1])
print(new_s)
stack.append(number * new_s)
return "".join(stack)
и это рабочее решение:
class Solution:
def decodeString(self, s: str) -> str:
stack = []
for ch in s:
if ch != ']':
stack.append(ch)
else:
# Collect the characters forming the encoded string
decoded_string = []
while stack[-1] != '[':
decoded_string.append(stack.pop())
stack.pop() # Remove the '['
# Now reverse the decoded string to get the correct order
decoded_string = ''.join(decoded_string[::-1])
# Get the number (how many times to repeat)
number = []
while stack and stack[-1].isdigit():
number.append(stack.pop())
number = int(''.join(number[::-1]))
# Append the repeated decoded string back to the stack
stack.append(number * decoded_string)
return "".join(stack)
Почему не работает первая функция? Я действительно думаю, что нет никакой разницы, кроме того, что я переворачиваю строку, а правильный код переворачивает список.
Ввод: 3[z]2[2[y]pq4[2[jk]e1[f]]]ef
Выход:
zzzyypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjkef
Ожидал:
zzzyypqjkjkefjkjkefjkjkefjkjkefyypqjkjkefjkjkefjkjkefjkjkefef
Я просто не понимаю, почему один алгоритм работает, а другой нет...
Привет, Тим, это не удается: вывод «3[z]2[2[y]pq4[2[jk]e1[f]]]ef»: ожидается «zzzyypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjkef»: «zzzyypqjkjkefjkjkefjkjkefjkjke» fyypqjkjkefjkjkefjkjkefjkjkefef"
Итак, мы видим, что происходит какое-то странное поведение, когда "ef" находится не в том месте, но я не понимаю, почему :(
Что значит «не работает»? Каково ожидаемое поведение? Пробовали ли вы пройти построчно оба кода одновременно с помощью отладчика, чтобы сравнить поведение?
@jabaa все есть в комментариях выше. Спасибо
Пожалуйста, добавьте все подробности в вопрос. Комментарии часто через некоторое время удаляются и не сохраняются в истории. Многие пользователи не читают все комментарии. Не могу найти описание кодов в комментариях. Я не могу найти результаты вашей отладки в комментариях. Спасибо.
Пожалуйста, отредактируйте вопрос, чтобы объяснить, что должен делать код. Мы не знаем проблем LeetCode по имени.
Более простой ввод — 2[2[ab]]
. Первый подход возвращает babababa
, а второй — abababab
. Этот короткий ввод должно быть легче отлаживать.
Посмотрите Как отлаживать небольшие программы Эрика Липперта. Если у вас есть рабочий код для сравнения, шаг резиновой утки должен быть намного короче :) Хотя в этой программе некоторые другие шаги могут быть не очень полезными или практичными, например, разбиение вашего кода и написание спецификаций.
Спасибо @Barmar за предложения. извините, это мой первый пост, поэтому я учусь :)
Разница здесь тонкая. Если бы вы напечатали стек в конце каждого цикла, вы бы его увидели. Вот трассировка стека вашего кода:
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', 'kjkjefkjkjefkjkjefkjkjef']
['zzz', 'yypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjk']
Против их кода:
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', 'jkjkefjkjkefjkjkefjkjkef']
['zzz', 'yypqjkjkefjkjkefjkjkefjkjkefyypqjkjkefjkjkefjkjkefjkjkef']
Вы это видите? Когда стек содержит многосимвольную строку, ваш код инвертирует всю строку, поэтому «jkjkef» становится «fekjkj». ИХ код инвертирует список и объединяет результат, создавая «фейкджк». Строки в списке сохраняют свой порядок, как и должно быть.
Большое спасибо! Теперь я понял. Очень красивое объяснение
На каком тесте он не проходит? Очевидно, что это работает на трех образцах.