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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路:这道题类似排列生成算法(permutation generation),由于每次生成的选择只有两种可能(左括号和右括号),我们可以构造一颗深度为2n的二叉树,然后对这颗二叉树进行遍历,这颗二叉树的每个节点为在这此之前做出的选择得到的结果(根节点为空""),每条边为此次的选择('(' 或者 ')'),在去除掉非法的选择(对于任意一次选择,左括号被选择的次数不能小于右括号,且不能超过n)后,最后第2n层的所有叶节点即为选择结果。
public class Solution {
public List<String> res;
public List<String> generateParenthesis(int n) {
res = new LinkedList<>();
StringBuilder str = new StringBuilder("");
generateParenthesis(n, n, str);
return res;
}
private void generateParenthesis(int left, int right, StringBuilder str) {
if (left > right || left < 0 || right < 0) return;
if (left == 0 && right == 0) {
res.add(str.toString());
return;
}
generateParenthesis(left - 1, right, str.append('('));
str.deleteCharAt(str.length() - 1);
generateParenthesis(left, right - 1, str.append(')'));
str.deleteCharAt(str.length() - 1);
}
}