题目描述
数字 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;
}