标签:方法 复杂 leetcode 条件 获得 不同 arraylist 组合 包括
给出?n?代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出?n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
dp[n]=‘(‘+dp[i]+‘)‘+dp[n-1-i] ,n 从0到用户输入的N,对于计算dp[n]遍历所有可能的i,
,其中dp[n]表示长度为2*n的所有有效串。class Solution {
public static List<String> generateParenthesis(int n) {
List<String> parenthesis = new ArrayList<>();
traceBack("", 0, 0, n, parenthesis);
return parenthesis;
}
private static void traceBack(String str, int left, int right, int n,
List<String> parenthesis) {
if (str.length() == 2 * n) {
parenthesis.add(new String(str));
return;
}
if (left < n) {
traceBack(str + '(', left + 1, right, n, parenthesis);
}
if (right < left) {
traceBack(str + ')', left, right + 1, n, parenthesis);
}
}
}
class Solution {
public List<String> generateParenthesis(int n) {
List<List<String>> parenthesis = new ArrayList<>();// 所有长度<=2n的括号组合
// 将长度为0的括号组合,放入parenthesis
ArrayList<String> list = new ArrayList<>();
list.add("");
parenthesis.add(list);
// 由nn为1至n一层层算2*nn长度的括号组合,放入parenthesis
for (int nn = 1; nn <= n; ++nn) {
List<String> parenthesisTemp = new ArrayList<>();
for (int leftLen = 0; leftLen <= nn - 1; ++leftLen) {
for (String leftStr : parenthesis.get(leftLen)) {
for (String rightStr : parenthesis.get(nn - 1 - leftLen)) {
parenthesisTemp.add(new String('(' + leftStr + ')' + rightStr));
}
}
}
parenthesis.add(parenthesisTemp);
}
return parenthesis.get(n);
}
}
标签:方法 复杂 leetcode 条件 获得 不同 arraylist 组合 包括
原文地址:https://www.cnblogs.com/coding-gaga/p/12070496.html