例如,给出n=3,解集为:
	"((()))", "(()())", "(())()", "()()()", "()(())" 
	数据范围:
 
	要求:空间复杂度 
,时间复杂度 )
                                        int cmp(const void *a, const void *b) {
    int i=0;
    while(i<strlen(*(char**)a)) {
        if((*(char**)a)[i] > (*(char**)b)[i])
            return 1;
        else if((*(char**)a)[i] < (*(char**)b)[i])
            return -1;
        else
            i++;
    }
    return 0;
}
    
char** generateParenthesis(int n, int* returnSize ) {
    char **proRes, **res, **lastres;
    int lastreturnSize, proResreturnSize;
    int i, j;
    proRes = (char**)malloc(pow(2,14));
    for(i=0; i<pow(2,14); i++) 
        proRes[i] = (char*)malloc(n*2+1);
    if(n==0)
        *returnSize = 0;
    strcpy(proRes[0], "()");
    *returnSize = 1;
    if(n==1) 
        return proRes;
    lastres = generateParenthesis(n-1, &lastreturnSize);
    for(i=0, proResreturnSize=0; i<lastreturnSize; i++) {
        for(j=0; j<strlen(lastres[i])+1; j++) {
            if(j==0) {
                strcpy(proRes[proResreturnSize], "()");
                strcat(proRes[proResreturnSize++], lastres[i]);
            }
            else if(lastres[i][j-1]=='(' && lastres[i][j]==')') {
                strncpy(proRes[proResreturnSize], lastres[i], j);
                proRes[proResreturnSize][j] = 0;
                strcat(proRes[proResreturnSize], "()");
                strcat(proRes[proResreturnSize++], lastres[i]+j);
            }
            else if(lastres[i][j-1]==')' && lastres[i][j]=='(' && strncmp(lastres[i]+j-2, "()", 2)!=0) {
                strncpy(proRes[proResreturnSize], lastres[i], j);
                proRes[proResreturnSize][j] = 0;
                strcat(proRes[proResreturnSize], "()");
                strcat(proRes[proResreturnSize++], lastres[i]+j);
            }
            else if(lastres[i][j-1]=='(' && lastres[i][j]=='(') {
                {
                    int m=0,n=0;
                    strncpy(proRes[proResreturnSize], lastres[i], j);
                    proRes[proResreturnSize][j] = 0;
                    strcat(proRes[proResreturnSize], "(");
                    while (1) {
                        if(lastres[i][j+n]=='(') {
                            m++;
                            n++;
                            strcat(proRes[proResreturnSize], "(");
                        }
                        else if(lastres[i][j+n]==')') {
                            m--;
                            n++;
                            strcat(proRes[proResreturnSize], ")");
                        }
                        else
                            break;
                        if(m==0) 
                            break;
                    }
                    strcat(proRes[proResreturnSize], ")");
                    strcat(proRes[proResreturnSize++], lastres[i]+j+n);
                }
                if(strncmp(lastres[i]+j-2, "()", 2)!=0) {
                    strncpy(proRes[proResreturnSize], lastres[i], j);
                    proRes[proResreturnSize][j] = 0;
                    strcat(proRes[proResreturnSize], "()");
                    strcat(proRes[proResreturnSize++], lastres[i]+j);
                }
            }
        }
    }
    
    qsort(proRes, proResreturnSize, sizeof(char*), cmp);
    res = (char**)malloc(proResreturnSize*sizeof(char*));
    res[0] = (char*)malloc(n*2+1);
    strcpy(res[0], proRes[0]);
    *returnSize=1;
    for(i=1; i<proResreturnSize; i++) {
        if(strcmp(res[*returnSize-1], proRes[i])!=0) {
            res[*returnSize] = (char*)malloc((n*2+1));
            strcpy(res[*returnSize], proRes[i]);
            (*returnSize)++;
        }
    }
    return res;
}