Учебная записка [Medium] Leetcode#22 Generate Parentheses

RedDeveloper
17.04.2023 14:36
Учебная записка [Medium] Leetcode#22 Generate Parentheses

На этот раз мы собираемся решить еще одну классическую проблему, связанную с парными скобками, так называемую генерацию скобок.

Описание задачи выглядит следующим образом.

Даны n пар круглых скобок, напишите функцию для генерации всех комбинаций правильно оформленных круглых скобок.

Пример 1:

Input: n = 1
Output: ["()"]

Пример 2:

Input: n = 2
Output: ["()()","(())"]

Пример 3:

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]

Давайте понаблюдаем за шаблоном генерации на примере небольших случаев.

Для n = 0, очевидно, это тривиальный случай [] # пустой список

Для n = 1, только один допустимый вывод ["()"].

Для n = 2, мы можем рассматривать n = 2 как своего рода эволюцию от n = 1.

На этот раз мы должны составить еще одну пару на основе n = 1

Форма генерации может быть переписана как ( + preStr ) + postStr, где

PreStr содержит i пар, причем одна куртка () вносит одну пару. А postStr вносит n-1-i пар.

Таким образом, мы имеем

()(), в котором мы заключаем исходную строку с еще одной парой вне preStr как пустой строки, а также postStr как (), или

( () ), в которую мы заключаем исходную строку с еще одной парой вне preStr как (), а также postStr как пустую строку.

Два допустимых вывода для n= 2

["()()", "(())"]

Для n = 3 мы можем рассматривать n = 3 как своего рода эволюцию от n = 2

Опять же, мы должны составить еще одну пару на основе n = 2

Напомним, что форма генерации может быть переписана как ( + preStr ) + postStr, где

PreStr содержит i пар, причем одна куртка вносит одну пару. А postStr вносит n-1-i пар.

Таким образом, мы имеем

() ()(), и () (()), которые мы заключаем исходную строку с еще одной парой вне preStr как пустую строку и postStr как ()() и (()), или

() () ) (), в которые мы заключаем исходную строку с еще одной парой вне preStr как () и postStr как (), или

( ()() ), и ( (()) ), которые мы заключаем в исходную строку с еще одной парой снаружи preStr как ()() и (()) и postStr как ()() и (()).

Пять допустимых выходов для n= 3

["((()))","(()())","(())()","()(())","()()()"]

Теперь у нас есть общая картина шаблона допустимой пары скобок.

Давайте реализуем его в Python.

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:

        # memoization
        memo = {
            # base case
            0: [""],
            1: ["()"]
        }

        
        def gen(n: int):
            
            # look up table
            if n in memo:
                return memo[n]

            # general cases:
            # preStr contribute i pairs,
            # () jacket contribute 1 pair,
            # postStr contibutes (n-1-i) pairs
            memo[n] = [ "(" + preStr + ")" + postStr for i in range(n) for preStr in gen(i) for postStr in gen(n-1-i) ]
            return memo[n]

        # ---------------------
        return gen(n)

Временная сложность:

O( 4^n/ sqrt(n) ), это то же самое, что и n-ое каталанское число .

Пространственная сложность:

O( 4^n/ sqrt(n) ), это то же самое, что и n-ое каталанское число .

Подробный вывод верхней границы для n-го каталанского числа можно найти здесь.

Ссылка:

[1] Leetcode #22 Generate brackhes

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?

05.05.2023 14:00

Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.

Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом

05.05.2023 11:59

Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря своим методам, они делают код очень простым для понимания и читабельным.

JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы

05.05.2023 11:57

Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний, то, не теряя времени, практикуйте наш бесплатный онлайн тест 1100+ JavaScript MCQs и развивайте свои навыки и знания.

Массив зависимостей в React
Массив зависимостей в React

05.05.2023 09:44

Все о массиве Dependency и его связи с useEffect.