Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
构造树,顶点为( ,然后左孩子为(,右孩子为 )。
当左括号和右括号相等且等于n时,说明都已用完,此时,,把答案记录下来。
然后 只要左括号没有用完,就可以加左括号;只要右括号比左括号少,就可以加右括号。
top - down解法:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
Stack<String> path = new Stack<>();
dfs("(", 1, 0, n, result, path);
return result;
}
private void dfs(String s, int leftNum, int rightNum, int n,
List<String> result, Stack<String> path) {
path.push(s);
if (leftNum == rightNum && leftNum == n) {
result.add(String.join("", path));
}
if (leftNum < n) {
dfs("(", leftNum + 1, rightNum, n, result, path);
}
if (rightNum < leftNum) {
dfs(")", leftNum, rightNum + 1, n, result, path);
}
path.pop();
}
}
dfs中的“(” 就相当于将root节点传了进去,然后每次dfs,统计左括号个数,以及右括号个数,来决定接下来往哪边走。