學渣帶你刷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;
}

 

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