#include <bits/stdc++.h>
using namespace std;
void generateSequence(int numOpened, int numClosed, string seq, int n, vector<string>& combinations) {
if(seq.size() == 2 * n) {
// base case: if the size of the sequence is 2*n, so we put n opening '('
// and n closing ')', so a valid was produced
combinations.push_back(seq);
return;
}
if(numOpened < n) {
// put an opening '(' if the number of opened '(' < n
generateSequence(numOpened + 1, numClosed, seq + '(', n, combinations);
}
if(numClosed < numOpened) {
// put a closing ')' only if there is unmathced opened '(', i.e.,
// the number of closed ')' is strictly less than the number of opened '('
generateSequence(numOpened, numClosed + 1, seq + ')', n, combinations);
}
}
vector<string> generateParentheses(int n) {
// wrapper function
vector<string> combinations; // an array of all valid sequences produced
// start the sequence with 0 opening '(' and 0 closed ')' with an empty sequence ""
generateSequence(0, 0, "", n, combinations);
return combinations; // return the array after filling it
}
int main() {
int n = 4;
vector<string> combinations = generateParentheses(n);
// output the valid sequences produced
cout << "For n = " << n << ", the number of valid combinations producded = " << combinations.size() << '\n';
for(auto&combination:combinations) cout << combination << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIGdlbmVyYXRlU2VxdWVuY2UoaW50IG51bU9wZW5lZCwgaW50IG51bUNsb3NlZCwgc3RyaW5nIHNlcSwgaW50IG4sIHZlY3RvcjxzdHJpbmc+JiBjb21iaW5hdGlvbnMpIHsKICAgIGlmKHNlcS5zaXplKCkgPT0gMiAqIG4pIHsKICAgICAgICAvLyBiYXNlIGNhc2U6IGlmIHRoZSBzaXplIG9mIHRoZSBzZXF1ZW5jZSBpcyAyKm4sIHNvIHdlIHB1dCBuIG9wZW5pbmcgJygnCiAgICAgICAgLy8gYW5kIG4gY2xvc2luZyAnKScsIHNvIGEgdmFsaWQgd2FzIHByb2R1Y2VkCiAgICAgICAgY29tYmluYXRpb25zLnB1c2hfYmFjayhzZXEpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKG51bU9wZW5lZCA8IG4pIHsKICAgICAgICAvLyBwdXQgYW4gb3BlbmluZyAnKCcgaWYgdGhlIG51bWJlciBvZiBvcGVuZWQgJygnIDwgbgogICAgICAgIGdlbmVyYXRlU2VxdWVuY2UobnVtT3BlbmVkICsgMSwgbnVtQ2xvc2VkLCBzZXEgKyAnKCcsIG4sIGNvbWJpbmF0aW9ucyk7CiAgICB9CiAgICBpZihudW1DbG9zZWQgPCBudW1PcGVuZWQpIHsKICAgICAgICAvLyBwdXQgYSBjbG9zaW5nICcpJyBvbmx5IGlmIHRoZXJlIGlzIHVubWF0aGNlZCBvcGVuZWQgJygnLCBpLmUuLAogICAgICAgIC8vIHRoZSBudW1iZXIgb2YgY2xvc2VkICcpJyBpcyBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBvcGVuZWQgJygnCiAgICAgICAgZ2VuZXJhdGVTZXF1ZW5jZShudW1PcGVuZWQsIG51bUNsb3NlZCArIDEsIHNlcSArICcpJywgbiwgY29tYmluYXRpb25zKTsKICAgIH0KfQoKdmVjdG9yPHN0cmluZz4gZ2VuZXJhdGVQYXJlbnRoZXNlcyhpbnQgbikgewogICAgLy8gd3JhcHBlciBmdW5jdGlvbgogICAgdmVjdG9yPHN0cmluZz4gY29tYmluYXRpb25zOyAvLyBhbiBhcnJheSBvZiBhbGwgdmFsaWQgc2VxdWVuY2VzIHByb2R1Y2VkCiAgICAvLyBzdGFydCB0aGUgc2VxdWVuY2Ugd2l0aCAwIG9wZW5pbmcgJygnIGFuZCAwIGNsb3NlZCAnKScgd2l0aCBhbiBlbXB0eSBzZXF1ZW5jZSAiIiAKICAgIGdlbmVyYXRlU2VxdWVuY2UoMCwgMCwgIiIsIG4sIGNvbWJpbmF0aW9ucyk7CiAgICByZXR1cm4gY29tYmluYXRpb25zOyAvLyByZXR1cm4gdGhlIGFycmF5IGFmdGVyIGZpbGxpbmcgaXQKfQoKaW50IG1haW4oKSB7CiAgICAKICAgIGludCBuID0gNDsKICAgIAogICAgdmVjdG9yPHN0cmluZz4gY29tYmluYXRpb25zID0gZ2VuZXJhdGVQYXJlbnRoZXNlcyhuKTsKICAgIC8vIG91dHB1dCB0aGUgdmFsaWQgc2VxdWVuY2VzIHByb2R1Y2VkCiAgICBjb3V0IDw8ICJGb3IgbiA9ICIgPDwgbiA8PCAiLCB0aGUgbnVtYmVyIG9mIHZhbGlkIGNvbWJpbmF0aW9ucyBwcm9kdWNkZWQgPSAiIDw8IGNvbWJpbmF0aW9ucy5zaXplKCkgPDwgJ1xuJzsKICAgIGZvcihhdXRvJmNvbWJpbmF0aW9uOmNvbWJpbmF0aW9ucykgY291dCA8PCBjb21iaW5hdGlvbiA8PCAnXG4nOwoKICAgIHJldHVybiAwOwp9Cg==