題目描述
數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。
示例:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/generate-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
告訴我們有n對括號,輸出多少個符合規則的括號組合,左右要成對出現,)(這樣肯定不行,())(也不行。之類的吧。
算法:
(1)輸入整數
(2)輸出的還是二維字符數組
(3)DFS生成並輸出符合規則的樹
(4)看示意圖,以2對爲例子,優先方左括號,左邊放完了,試試右邊的。
看圖也看不懂,就看代碼提及,之後再看看視頻聽我細細道來。
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
/*********回溯算法*********/
int pos=0;
/*********回溯算法*********/
void DFS(int left,int right,int n,char **res,int *returnSize,char *returnColumnSizes,int index)
{
int i;
/***********終止,輸出結果***********/
if(left==n&&right==n)
{
res[*returnSize]=(char *)malloc(sizeof(char)*(2*n+1));
for(i=0;i<2*n;i++)
res[*returnSize][i]=returnColumnSizes[i];
res[*returnSize][i]='\0';
(*returnSize)++;
return;
}
if(left<n) //左括號可以放,之後左用了一個
{
returnColumnSizes[index]='(';
DFS(left+1,right,n,res,returnSize,returnColumnSizes,index+1);
// pos--;
}
if(right<n&&left>right) //如果缺少left>right,則會出現無效括號,即括號不匹配
{
returnColumnSizes[index]=')';
// returnColumnSizes[pos++]=')';
DFS(left,right+1,n,res,returnSize,returnColumnSizes,index+1);
// pos--;
}
}
char ** generateParenthesis(int n, int* returnSize)
{
int Size=pow(2,2*n);
char **res=(char **)malloc(sizeof(char *)*(Size));//創建二維數組
int index=0;
char *returnColumnSizes=(char *)malloc(sizeof(char)*(2*n+1));//創建存儲數組,存儲當前數據
*returnSize=0; //返回數組的長度
DFS(0,0,n,res,returnSize,returnColumnSizes,index);
return res;
}
int main()
{
int n,i;
scanf("%d",&n);
int returnSize;
char **result=generateParenthesis(n, &returnSize);
for (i = 0; i < returnSize; i++)
{
printf("%s\n",*(result+i));
}
return 0;
}