LeetCode 22题:括号生成——C语言和Python


题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

思路

可以列举出可能的组合,然后判断符号的合理性。

有效的括号 的题目判断合理性比这道题难,该题可以将左括号视为-1,有括号视为1。计算组合的和,一旦和sum==1, 则括号组合不合理,sum==0,则正好配对,sum==-1,则还差一个右括号。

对于找出可能的组合,电话号码的字母组合与这道题相似,利用递归。

Python代码

class Solution(object):
    def generateParenthesis(self, n):
        list=[]
        s=['(']
        sum=-1
        def combine(sum,s):
            if sum>0:
                return
            if len(s)==2*n and sum==0:
                temp=''.join(s)
                list.append(temp)
                return
            if len(s)==2*n:#此时sum!=0,不合理
                return 
            for i in range(2):
                if i==0:
                    s.append(')')
                    combine(sum+1,s)
                    s.pop()
                else:
                    s.append('(')
                    combine(sum-1,s)
                    s.pop() 
        combine(sum,s)
        return list
A=Solution()
n=2
print(A.generateParenthesis(n))

C语言

// 回溯法求解
#define MAX_SIZE 1430  // 卡特兰数: 1, 1, 2, 5, 14, 42, 132, 429, 1430
void generate(int left, int right, int n, char *str, int index, char **result, int *returnSize) {
    if (index == 2 * n) { // 当前长度已达2n
        result[(*returnSize)] =  (char*)calloc((2 * n + 1), sizeof(char));
        strcpy(result[(*returnSize)++], str);
        return;
    }
    // 如果左括号数量不大于 n,可以放一个左括号
    if (left < n) {
        str[index] = '(';
        generate(left + 1, right, n, str, index + 1, result, returnSize);
    }
    // 如果右括号数量小于左括号的数量,可以放一个右括号
    if (right < left) {
        str[index] = ')';
        generate(left, right + 1, n, str, index + 1, result, returnSize);
    }
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char** generateParenthesis(int n, int *returnSize) {
    char *str = (char*)calloc((2 * n + 1), sizeof(char));
    char **result = (char **)malloc(sizeof(char *) * MAX_SIZE);
    *returnSize = 0;
    generate(0, 0, n, str, 0, result, returnSize);
    return result;
}

/*
作者:ciciywg
链接:https://leetcode.cn/problems/generate-parentheses/solutions/648432/jian-ji-cyu-yan-hui-su-fa-qiu-jie-by-cic-bdv5/
来源:力扣(LeetCode)
*/

总结

以上就是今天要讲的内容,继续练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值