死磕算法2、括号生成

9 篇文章 0 订阅

题目

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

解法

 public static void main(String[] args) {
     System.out.println(generateParenthesis(2));
 }
 public static  List<String> generateParenthesis(int n) {
     List<String> res = new ArrayList<String>();
     helper(n, n, "", res);
     return res;
 }
 static void helper(int left, int right, String out, List<String> res) {
     if (left < 0 || right < 0 || left > right) return;
     if (left == 0 && right == 0) {
         res.add(out);
         return;
     }
     helper(left - 1, right, out + "(", res);
     helper(left, right - 1, out + ")", res);
 }

解析

对于这种题,还是要先考虑使用递归,先定义两个变量 left 和 right 分别表示剩余左右括号的个数,如果在某次递归时,左括号的个数大于右括号的个数,说明此时生成的字符串中右括号的个数大于左括号的个数,即会出现 ‘)(’ 这样的非法串,所以这种情况直接返回,不继续处理。如果 left 和 right 都为0,则说明此时生成的字符串已有3个左括号和3个右括号,且字符串合法,则存入结果中后返回。如果以上两种情况都不满足,若此时 left 大于0,则调用递归函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值