本周題目難度級別"Medium",沒錯,比較難。。。
題目:就是給你一個數字n,讓你輸出n個左右括號"()"的排列組合。
思路:給一個n,則有n個左括號和n個右括號,排列組合用到了遞歸,把所有的組合列出來你就會發現兩個原則,一是所有的組合都是從左括號開始,并且都是從1個左括號、2個左括號。。。一直到n個左括號;二是每個右括號的前面都會有一個左括號對應,例如第6個右括號前一定有大于等于6個的左括號與之對應。思路其實不難,關鍵是實現難,下面來看看代碼(從英文注釋下方開始看):
void generate(char** result,int* size,int l,int r,char* tmp,int index){
//當左括號和右括號都用完的時候停止
if(l==0 && r==0){
//設置結束位
tmp[index]=0;
result[*size]=(char*)malloc(sizeof(char)*index);
//復制
strcpy(result[*size],tmp);
(*size)++;
return;
}
//左括號的個數大于0(原則一)
if(l>0){
//對應位置設為左括號
tmp[index]='(';
//遞歸
generate(result,size,l-1,r,tmp,index+1);
}
//右括號的個數大于0,并且左括號的個數小于右括號的個數(原則二)
if(r>0 && l<r){
tmp[index]=')';
//遞歸
generate(result,size,l,r-1,tmp,index+1);
}
}
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
char** generateParenthesis(int n, int* returnSize) {
char** result;
//存放一種組合
char* tmp=(char*)malloc(sizeof(char)*(n*2+1));
//l是左括號的個數,r是右括號的個數
int l=n,r=n;
//無法確定有多少種組合,就寫的大一點
result =(char**)malloc(sizeof(char*)*1000000);
*returnSize=0;
//最后的0是從對應的位置,因為這是從第一個開始,所以是0
generate(result,returnSize,l,r,tmp,0);
return result;
}