括号生成
题目介绍
括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
1 2
| 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
|
示例 2:
提示:
题目解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package algorithm;
import java.util.ArrayList; import java.util.List;
public class GenerateParentheses {
static ArrayList[] cache = new ArrayList[100];
public static List<String> generate(int n) { if (cache[n] != null) { return cache[n]; } ArrayList<String> ans = new ArrayList<>(); if (n == 0) { ans.add(""); } else { for (int c = 0; c < n; ++c) { for (String left : generate(c)) { for (String right: generate(n - 1 - c)) { ans.add("(" + left + ")" + right); } } } } cache[n] = ans; return ans; }
public static List<String> generateParenthesis(int n) { return generate(n); }
public static void main(String[] args) {
System.out.println(generate(3));
System.out.println(generate(1)); } }
|
打印:
1 2
| [()()(), ()(()), (())(), (()()), ((()))] [()]
|
思路:
本来以为是很难的,官方的三种思路都想过,自己算了下复杂度,感觉不对,没想到三种都想到了。也就是,一个生成,一个校验,这是第一种;校验的过程再给个优化,括号数量配对,这是第二种;开头结尾必须是()这两个,这是第三种,然后通过拼接分割右括号的左右字符串完成。