0
点赞
收藏
分享

微信扫一扫

LeetCode刷题笔记-22.括号生成

月白色的大狒 2022-04-07 阅读 50

LeetCode刷题笔记-22.括号生成

C语言

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void bt(char ***ret, int *retsize, int *retcap, char *buf, int l, int r, int n) {
    if (l > n || r > n) {
        return;
    }
    if (r > l)
        return;
    if (l == r && r == n) {
        *retsize += 1;
        if (*retsize > (*retcap - 2)) {
            *retcap = (*retcap) << 1;
            *ret = realloc(*ret, (*retcap) * sizeof(char *));
        }
        (*ret)[(*retsize)-1] = strdup(buf);
        return;
    } 
    buf[l+r] = '(';
    bt(ret, retsize, retcap, buf, l+1, r, n);
    buf[l+r] = ')';
    bt(ret, retsize, retcap, buf, l, r+1, n);
}
char ** generateParenthesis(int n, int* returnSize){
    int size = 0;
    int cap = 0;
    char **ret = NULL;
    char buf[64] = {0};

    cap = 1 << 4;
    ret = calloc(cap, sizeof(char *));
    bt(&ret, &size, &cap, &buf[0], 0, 0, n);
    *returnSize = size;
    return ret;
}

注意点

  1. 递归控制条件l <= n || r <= n必须满足,避免无线扩张;
  2. 未知最后的总条数,根据实际去动态生成char *数目,总数不是(1<<(n-1));
  3. 优化ret的生成的时候,注意ret的预分配,如ret = calloc(...)否则影响ret = realloc(...)的逻辑;

结果

在这里插入图片描述

题目

在这里插入图片描述

举报

相关推荐

0 条评论