【题目标题】
括号生成
【题目描述】
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 有效括号组合需满足:左括号必须以正确的顺序闭合。
示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2: 输入:n = 1 输出:["()"]
提示: 1 <= n <= 8
【解题思路】
【动态规划法】
【代码实现】
class Solution {
public List<String> generateParenthesis(int n) {
List<String> resultOf0 = new ArrayList<>();
resultOf0.add("");
List<String> resultOf1 = new ArrayList<>();
resultOf1.add("()");
List<List<String>> resultList = new ArrayList<>();
resultList.add(resultOf0);
resultList.add(resultOf1);
for (int i = 2; i <= n; i++) {
resultList.add(getResultOfI(resultList, i));
}
return resultList.get(n);
}
private List<String> getResultOfI(List<List<String>> resultList, int i) {
List<String> resultOfI = new ArrayList<>();
for (int leftIndex = 0; leftIndex <= i - 1; leftIndex++) {
List<String> resultOfOneResultOfI = getResultOfOneResultOfI(resultList, leftIndex, i - 1 - leftIndex);
resultOfI.addAll(resultOfOneResultOfI);
}
return resultOfI;
}
private List<String> getResultOfOneResultOfI(List<List<String>> resultList, int leftIndex, int rightIndex) {
List<String> resultOfOneResultOfI = new ArrayList<>();
List<String> resultOfLeftIndex = resultList.get(leftIndex);
List<String> resultOfRightIndex = resultList.get(rightIndex);
for (int m = 0; m < resultOfLeftIndex.size(); m++) {
for (int n = 0; n < resultOfRightIndex.size(); n++) {
resultOfOneResultOfI.add("(" + resultOfLeftIndex.get(m) + ")" + resultOfRightIndex.get(n));
}
}
return resultOfOneResultOfI;
}
}