← Назад

Neetcode | Decode String

В этой статье рассмотрим решение одной алгоритмической задачки под названием «Decode string».

Описание задачи

На вход даётся закодированная строка. Правило кодирования простое: k[encoded_string]. Это означает, что строку encoded_string нужно повторить k раз. Скобки могут быть вложенными.

На примере строки 2[a3[b]]c

  1. сначала разбираем 3[b] = bbb
  2. получаем 2[abbb]c
  3. затем 2[abbb] = abbbabbb
  4. и в конце добавляем c
  5. Итог: abbbabbbc

Ограничения по условию:

  • k — всегда положительное целое
  • скобки всегда корректны
  • нет конструкций типа 3a или a[2]
  • итоговая строка не длиннее 100 000 символов

Решение

Главная сложность — вложенность. Внутри одной пары скобок может быть ещё одна пара, и так несколько уровней. Самый естественный способ решить такую задачу — использовать стек. Причём стеков понадобится два: один для чисел (коэффициентов повтора), другой для строк.

Алгоритм решения

  1. Идём по строке слева направо, обрабатывая каждый символ.
  2. Если символ — цифра — накапливаем текущее число (цифры могут идти подряд, образуя многозначное число).
  3. Если символ — буква — накапливаем текущую строку.
  4. Если символ — [ — сохраняем текущую строку и текущее число в стеки, затем сбрасываем их для обработки нового уровня вложенности.
  5. Если символ — ] — извлекаем из стеков предыдущее число k и предыдущую строку prev. Повторяем текущую строку k раз и приклеиваем её к prev. Это становится новой текущей строкой.

В конце остаётся текущая строка — это и есть декодированный результат.

О-большое

Время: O(n × m), где n — длина входной строки, m — максимальный коэффициент повтора. На практике все символы обрабатываются один раз, а повторение строк выполняется суммарно за O(длина выхода). Так как длина выхода не превышает 100 000, это эффективно.

Память: O(n) под стеки и промежуточные строки.

Решение на Go

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

go
...

Похожие статьи

Quick Sort: быстрая сортировка

Сортировка — одна из базовых задач в программировании. Упорядоченные данные легче искать, сравнивать и обрабатывать. За десятилетия придумали десятки алгоритмов сортировки. У каждого свои сильные и слабые стороны. Сегодня рассмотрим Quick Sort,

09.04.2026 · 3 мин

Бинарный поиск | Алгоритмы

Рассмотрим на практике как работает бинарный поиск.

07.04.2026 · 2 мин

Циклический односвязный список

Ранее я подробно объяснил что такое односвязный список. Сейчас же поговорим про односвязный циклический список.

07.04.2026 · 2 мин

Осторожно! Округление в Go может вас удивить!

*и не только в Go. Про округлечение вещественных чисел, как это происходит в памяти...

07.04.2026 · 2 мин

Комментарии

0

Ты: ...

Пока нет комментариев. Будь первым.