leetcode22. 括号生成 力扣 java版本

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

 

package leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 江河
 * @date 2019-09-17 14:37
 * 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
 * 例如,给出 n = 3,生成结果为:
 * [
 *   "((()))",
 *   "(()())",
 *   "(())()",
 *   "()(())",
 *   "()()()"
 * ]
 *
 * 分析:我们可以定义n数括号(),剩下的n-1个括号要么在n这个括号里
 * 要么就在其右边
 * 既然知道了 i generateParenthesis(int n) {
    //创建个嵌套集合
    List> result = new ArrayList<>();
    //不存在直接返回
    if (n == 0){
      return result.get(0);
    }
    //
    List list0 = new ArrayList<>();
    list0.add("");
    result.add(list0);
    List list1 = new ArrayList<>();
    list1.add("()");
    result.add(list1);
    //上面两步添加到result集合里为n这个对应括号,""这个代表为空在"(" + s1 + ")" + s2;
    //中s1或是s2中要么为空要么有括号
    //下面从2开始循环
    for (int i = 2; i <= n; i++) {
      List temp = new ArrayList<>();
      //下面是进行排列组合j怎么得出限制的?
      for (int j = 0; j < i; j++) {
        /**
         * j =0时候只有一种组合""  i-1-j=1有一中()==》得出()()
         * j =1 ==》()一种组合 ,i-1-j=0有一种 "" ==》得出(())
         * 存result
         * 现在有 三种组合["",(),()() (())]与()组合了
         */
        List str1 = result.get(j);
        List str2 = result.get(i - 1 - j);
        for (String s1 : str1) {
          for (String s2 : str2) {
            String el = "(" + s1 + ")" + s2;
            temp.add(el);
          }
        }

      }
      result.add(temp);
    }
    return result.get(n);
  }

  public static void main(String[] args) {
    int n=3;
    List ss = generateParenthesis(n);
    System.out.println(ss);
  }
}

 

你可能感兴趣的:(leetcode)