メインコンテンツへスキップ

NeetCode 150 [Stack]:medium 3/5

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

NeetCodeのSolutionを書いていく
#

Generate Parentheses
#

問題概要
#

整数nが与えられます。n個の括弧のペアで作れる括弧の文字列を返しなさい。

  • 制約
    • nは1以上7以下

計算量:O(4^n / sqrt(n)) メモリ:O(n)

#

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

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

メモ
#

計算オーダーの記載がすごい。 例えば4だと、4^4/sqrt(4) = 128回の計算でできるということか。

相変わらずわからない。。。 ヒントを見ると、カッコが有効な場合のみを探して正解に足していけば良いとのこと。 ループが描きづらいので再帰関数で書いてみる。 かなり汚いができた!

from typing import List


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

        def func(s: str | None, n: int, open: int, close: int):
            if s is None:
                return

            for p in ["(", ")"]:
                if p == "(":
                    op = open + 1
                    if op > n:
                        op -= 1
                        func(None, n, op, close)
                    else:
                        func(s + p, n, op, close)
                else:
                    cl = close + 1
                    if open < cl:
                        cl -= 1
                        func(None, n, open, cl)
                    else:
                        s += p
                        if (open + cl) == 2 * n:
                            result.append(s)
                        else:
                            func(s, n, open, cl)

        func("", n, 0, 0)

        return result
Reply by Email

関連記事

NeetCode 150 [Stack]:medium 2/5
· loading · loading
NeetCode 150 [Stack]:medium 1/5
· loading · loading
NeetCode 150 [Sliding Window]:medium 3/3
· loading · loading