题目
类型:动态规划
难度:中等

解题思路
1、任何一个括号序列都一定是由 ( 开头,并且第一个 ( 一定有一个唯一与之对应的 )。这样一来,每一个括号序列可以用 (a)b 来表示,其中 a 与 b 分别是一个合法的括号序列(可以为空)。
2、要生成所有长度为 2 * n 的括号序列,定义一个函数 generate(n) 来返回所有可能的括号序列。那么在函数 generate(n) 的过程中:
- 枚举与第一个 ( 对应的 ) 的位置 2 * i + 1;
- 递归调用 generate(i) 即可计算 a 的所有可能性;
- 递归调用 generate(n - i - 1) 即可计算 b 的所有可能性;
- 遍历 a 与 b 的所有可能性并拼接,即可得到所有长度为 2 * n 的括号序列。
在每次 generate(i) 函数返回之前,把返回值存储起来,下次再调用 generate(i) 时可以直接返回,不需要再递归计算。
代码
class Solution {ArrayList[] cache = new ArrayList[100];public List<String> generate(int n) {if (cache[n] != null) {return cache[n];}ArrayList<String> ans = new ArrayList<String>();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 List<String> generateParenthesis(int n) {return generate(n);}}
