学渣带你刷Leetcode0022括号生成

题目描述

数字 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章