/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 */

void DFS(int left, int right, char **ret, char *str, int n, int* returnSize) {
    // 如果左右括号的数量都是n,那么表示组合结束,需要退出
    if(left == n && right == n) {
        // 申请内存长度为2n
        ret[(*returnSize)] = (char*)malloc(sizeof(char) * 2 * n);
        // 将str复制到返回的结果中
        strncpy(ret[(*returnSize)], str, 2 * n);
        (*returnSize)++;
        return;
    }
    // 如果左括号还没有用完,继续增加括号
    if(left < n) {
        str[left + right] = '(';
        DFS(left + 1, right, ret, str, n, returnSize);
    }
    // 如果右括号没有用完,并且个数小于左括号的个数,(如果大于等于左括号的个数,组合就不合法了)
    if(right < n && right < left) {
        str[left + right] = ')';
        DFS(left, right + 1, ret, str, n, returnSize);
    }
}



char** generateParenthesis(int n, int* returnSize ) {
    // write code here
    char **ret = (char**)malloc(sizeof(char*) * 2000);
    *returnSize = 0;
    char *str = (char*)malloc(sizeof(char) * 2 * n);
    DFS(0,0,ret,str,n,returnSize);
    return ret;
}