Задача на работу со скобками
Задача на построение алгоритма для вывода всех корректных (правильно открытых и закрытых) комбинаций из n пар круглых скобок.
18К открытий19К показов
Условие задачи
Реализуйте алгоритм для вывода всех корректных (правильно открытых и закрытых) комбинаций из n пар круглых скобок.
Пример:
Ввод: 3
Вывод: ( ( () ) ), ( ()() ), ( () )(), ()( () ), ()()()
Решение
Первое, что приходит в голову, — использовать рекурсивный подход и строить решение для f(n)
, добавляя пары круглых скобок в f(n-1)
. Мысль абсолютно здравая.
Рассмотрим решение для n = З
:
Как получить это решение из решения для n = 2
?
Можно вставить пары скобок в каждую существующую пару скобок, а также одну пару в начале строки. Другие возможные места для вставки скобок (например, в конце строки) сводятся к предыдущим случаям.
Итак, имеем следующее:
Постойте, в списке есть дубликаты! Строка () ( () )
встречается дважды! Если мы будем использовать данный подход, следует реализовать проверку дубликатов перед добавлением строки в список.
Алгоритм работает, но не очень эффективно. Он тратит слишком много времени на дублирующиеся строки.
Проблемы дублирования можно избежать путем построения строки с нуля. В этом случае левые и правые скобки добавляются до тех пор, пока выражение остается корректным.
При каждом рекурсивном вызове мы получаем индекс определенного символа в строке. Теперь нужно выбрать скобку (левую или правую). Когда можно использовать левую скобку, а когда — правую?
- Левая скобка: пока не израсходованы все левые скобки, мы всегда можем вставить левую скобку.
- Правая скобка: добавить правую скобку можно в том случае, если добавление не приведет к синтаксической ошибке. Когда появляется синтаксическая ошибка? Тогда, когда правых скобок больше, чем левых.
Таким образом, нам нужно отслеживать количество открывающих и закрывающих скобок. Если в строку можно вставить левую скобку, добавляем ее и продолжаем рекурсию. Если правых скобок осталось больше, чем левых, то вставляем правую скобку и продолжаем рекурсию.
Поскольку мы добавляем левые и правые скобки для каждого индекса в строке, индексы не повторяются, и каждая строка гарантированно будет уникальной .
18К открытий19К показов