Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions 22/22.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
## 何も見ずに解いてみる

```cpp
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string parenthesis;
generateParenthesisHelper(n, parenthesis, 0, 0, result);
return result;
}
private:
void generateParenthesisHelper(
const int n,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

関数の引数にプリミティブ型を渡す場合は const は付けないことが多いと思います。 n/num_open/num_close で const がついていたりついていなかったりするのも気になりました。

string& parenthesis,
int num_open,
int num_close,
vector<string>& 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
組み合わせの数はカタラン数というので求められるらしい。

<img width="793" height="584" alt="image" src="https://github.com/user-attachments/assets/c42360dc-d14e-44c3-aab4-37737473ba83" />

<img width="808" height="317" alt="image" src="https://github.com/user-attachments/assets/a1f604cc-8d61-4fb8-b685-246e59c4255b" />

ナルホド

## 最終コード

値渡しにしている以上`num_open`や`num_close`についても`const`にしても動くので`n`だけ`const int`なのはどうなのかなーと思いつつ、これだけに`const`をつけていたほうが`n`は最後までトップダウンで動かさずに伝えますよというニュアンスが伝わる気がする。

```cpp
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> 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<string>& result
) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好みの範囲かもしれませんが、num_open を これから parentheses に追加すべき数にすると n を渡さずに済むので好きです。お書きいただいた parentheses の中にある数を num_open とすると、重複している情報が渡されている点が気になりました(含まれている個数は数えたらわかるので)。

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();
}
}
};
```