22. Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Example 1:
Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]
Example 2:
Input: n = 1
Output: ["()"]
Constraints:
- 1 <= n <= 8
From: LeetCode
Link: 22. Generate Parentheses
Solution:
Ideas:
The recursive approach is employed to generate all possible combinations. At each recursive call, the code decides whether to add an opening parenthesis ( or a closing parenthesis ) based on certain conditions.
Key Observations:
You can only add an opening parenthesis if the number used so far is less than n.
You can only add a closing parenthesis if the number of opening parentheses used so far is greater than the number of closing parentheses. This ensures that we never have a situation like ()).
Code:
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void generate(int n, int open, int close, char* current, int index, char*** result, int* returnSize) {
if (index == 2 * n) {
current[index] = '\0';
(*result)[*returnSize] = strdup(current);
(*returnSize)++;
return;
}
if (open < n) {
current[index] = '(';
generate(n, open + 1, close, current, index + 1, result, returnSize);
}
if (close < open) {
current[index] = ')';
generate(n, open, close + 1, current, index + 1, result, returnSize);
}
}
int catalan(int n) {
int result = 1;
for (int i = 0; i < n; ++i) {
result *= (2 * n - i);
result /= (i + 1);
}
return result / (n + 1);
}
char** generateParenthesis(int n, int* returnSize) {
*returnSize = 0;
int maxCombination = catalan(n);
char** result = (char**) malloc(maxCombination * sizeof(char*));
char* current = (char*) malloc(2 * n + 1);
generate(n, 0, 0, current, 0, &result, returnSize);
free(current);
return result;
}