Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

README.md

以下は generateParenthesis の処理を、 図を用いて具体的に解析・説明した内容です。


1. 問題の概要

n個の括弧の組み合わせから「正しい組み合わせだけ」を出力する問題。

例:n = 3 の場合

全ての正しい括弧の組み合わせ:

((()))
(()())
(())()
()(())
()()()

2. 処理の流れ(図解)

状態木(ステートツリー)

初期状態:

current = ""
open = 3
close = 3

処理:バックトラッキング(再帰)

  • 「(」はまだ残っていれば追加可能
  • 「)」は、現在使った「(」より多くは使えない

n=3 の探索ツリー

                                   ""
                                  /  \
                                 (    ×
                            "("/      \
                            /           \
                         "(("            "()"
                        /   \              \
                    "((("   "(()"           "()("
                      |       /  \             \
                  "((()"  "(()("  "(())"       "()()"
                    |       |       |              \
                "((())" "(()()"  "(())("          "()()("
                    |       |       |                  \
                "((()))" "(()())" "(())()"           "()()()"

各ノードの意味

ノード 意味
"(((" 開き括弧3つ追加。閉じ括弧はまだ使えない。
"(()" 開き括弧2つ、閉じ括弧1つ。
"(()())" 完成パターン(正しい)
"((()))" 完成パターン(正しい)
"()()()" 完成パターン(正しい)

3. 状態管理

引数の管理

current 現在構築中の文字列
open 残り使える「(」の数
close 残り使える「)」の数

4. 制約と枝刈り

  • open > 0 → 「(」を追加
  • close > open → 「)」を追加(ただし「(」の数より多くは使えない)

図での枝刈り

current = "("   → OK (open > 0)
current = "()"  → OK (close > open)
current = ")("  → NG!(無視)← 不正な場合は探索しない

5. 具体例での再帰呼び出し

「(()())」ができる流れ

current open close
"" 3 3
"(" 2 3
"((" 1 3
"(()" 1 2
"(()(" 0 2
"(()()" 0 1
"(()())" 0 0 ✅ 完成!

6. 計算量解析

解の個数

カタラン数 Cn:

$$ C_n = \frac{1}{n+1} \cdot \binom{2n}{n} $$

例:

n 組み合わせ数
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430

時間・空間計算量

項目 計算量
時間計算量 O(4^n / √n)
空間計算量 O(4^n / √n)

理由: 「全ての正しい括弧の組み合わせ」の個数=カタラン数 → O(4^n / √n)


7. まとめ

このアルゴリズムの特徴

項目 内容
効率性 不要な組み合わせを生成しない(枝刈り)
シンプルさ 再帰+状態管理のみ
メモリ 結果+再帰スタックだけ使用

8. 全体フローまとめ図

開始 → ( または ) を選択しながら再帰探索
    └─ 「全ての開き括弧を使ったか?」
         └─ YES: 閉じ括弧だけ追加可能
         └─ NO: ( と ) の両方試す(ただし「)」はopen < close)
    └─ 完成したら result に追加