титульный
https://leetcode-cn.com/problems/decode-string/
Если задана закодированная строка, верните ее декодированную строку.
Правило кодирования: k [encoded_string], что означает, что encoded_string внутри квадратных скобок повторяется ровно k раз. Обратите внимание, что k гарантированно будет положительным целым числом.
Вы можете подумать, что входная строка всегда действительна, во входной строке нет лишнего пробела, а введенные квадратные скобки всегда соответствуют требованиям формата.
Кроме того, вы можете думать, что исходные данные не содержат чисел, все числа представляют только количество повторений k, например, никакой ввод, такой как 3a или 2 [4], не появится.
Пример:
s = "3 [a] 2 [bc]", вернуть "aaabcbc".
s = "3 [a2 [c]]", вернуть "accaccacc".
s = "2 [abc] 3 [cd] ef", вернуть "abcabccdcdcdef".
Идеи решения проблем (стек)
Декодирование эталонной строки (метод вспомогательного стека / рекурсивный метод, наглядная иллюстрация)
- Сканирование один раз спереди назад
- При сканировании, при обнаружении цифровых символов, используйте
n = n*10 + int(c)
обновляемые числа - При обнаружении
[
используйте стек, чтобы сохранить текущий множитель и префикс строки, а затем очистите эти две переменные до нуля. - При обнаружении
]
множитель стека и предыдущий префикс строки обновляются соответственно. - Это решение требует внимания:
- Время очистки строкового префикса и множителя
- Содержимое стека, как обновить префикс строки после стека
Код (стек)
class Solution:
def decodeString(self, s: str):
stack = []
n, res = 0, ''
for c in s:
if c.isdigit():
# - update n
n = n*10 + int(c)
elif c.isalpha():
# - update word
res += c
elif c == '[':
# - use stack to keep current n and res
stack.append([n, res])
n, res = 0, ''
elif c == ']':
# - last n and res
m, t = stack.pop()
# - update res
res = t + m*res
else:
pass
return res
Идеи решения проблем (рекурсивные)
Декодирование эталонной строки (метод вспомогательного стека / рекурсивный метод, наглядная иллюстрация)
- Идея рекурсии заключается в том, что
[
она будет рекурсивно обрабатывать строки после сканирования , пока не достигнет]
конца - Поскольку вам нужно пропустить обработанную подстроку, вам нужно передать конечный индекс в качестве возвращаемого значения.
- Следует отметить, что после получения рекурсивного возвращаемого значения префикс строки обновляется, и не забудьте сбросить множитель до 0
Код (рекурсивный)
class Solution:
def decodeString(self, s: str):
def dfs(i):
res, n = '', 0
while i < len(s):
c = s[i]
if c.isdigit():
n = n*10 + int(c)
elif c.isalpha():
res += c
elif c == '[':
r, i = dfs(i+1)
res += r * n
n = 0
elif c == ']':
return res, i
else:
pass
i += 1
return res, i
return dfs(0)[0]