From 7f722ae570c53e6c6de9d88e8e3de5ff4bab439c Mon Sep 17 00:00:00 2001 From: potrue <126231160+potrue@users.noreply.github.com> Date: Fri, 22 Aug 2025 00:39:20 +0900 Subject: [PATCH] 22. Generate Parentheses https://leetcode.com/problems/generate-parentheses/description/ --- 22/22.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 22/22.md diff --git a/22/22.md b/22/22.md new file mode 100644 index 0000000..2e40d20 --- /dev/null +++ b/22/22.md @@ -0,0 +1,90 @@ +## 何も見ずに解いてみる + +```cpp +class Solution { +public: + vector generateParenthesis(int n) { + vector result; + string parenthesis; + generateParenthesisHelper(n, parenthesis, 0, 0, result); + return result; + } +private: + void generateParenthesisHelper( + const int n, + string& parenthesis, + int num_open, + int num_close, + vector& result + ) { + if (num_close == n) { + result.emplace_back(parenthesis); + return; + } + if (num_open < n) { + parenthesis.push_back('('); + generateParenthesisHelper(n, parenthesis, num_open + 1, num_close, result); + parenthesis.pop_back(); + } + if (num_close < num_open) { + parenthesis.push_back(')'); + generateParenthesisHelper(n, parenthesis, num_open, num_close + 1, result); + parenthesis.pop_back(); + } + } +}; +``` + +## 他の人のコードを見てみる + +https://github.com/tokuhirat/LeetCode/pull/53/files +https://github.com/ryosuketc/leetcode_arai60/pull/42/files +https://github.com/Ryotaro25/leetcode_first60/pull/58/files + +https://ja.wikipedia.org/wiki/%E3%82%AB%E3%82%BF%E3%83%A9%E3%83%B3%E6%95%B0 +組み合わせの数はカタラン数というので求められるらしい。 + +image + +image + +ナルホド + +## 最終コード + +値渡しにしている以上`num_open`や`num_close`についても`const`にしても動くので`n`だけ`const int`なのはどうなのかなーと思いつつ、これだけに`const`をつけていたほうが`n`は最後までトップダウンで動かさずに伝えますよというニュアンスが伝わる気がする。 + +```cpp +class Solution { +public: + vector generateParenthesis(int n) { + vector result; + string parentheses; + generateParenthesisHelper(n, parentheses, 0, 0, result); + return result; + } +private: + void generateParenthesisHelper( + const int n, + string& parentheses, + int num_open, + int num_close, + vector& result + ) { + if (parentheses.size() == n * 2) { + result.emplace_back(parentheses); + return; + } + if (num_open < n) { + parentheses.push_back('('); + generateParenthesisHelper(n, parentheses, num_open + 1, num_close, result); + parentheses.pop_back(); + } + if (num_close < num_open) { + parentheses.push_back(')'); + generateParenthesisHelper(n, parentheses, num_open, num_close + 1, result); + parentheses.pop_back(); + } + } +}; +```