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,返回所有的n对合法的小括号的组合。
解题思路一:回溯,DFS有回退的探索所有可能。先生成(1...N个)左括号,然后生成不多于左括号个数个右括号。
public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<>(); if (n == 0) { return res; } btr("", res, 0, 0, n); System.out.println(res); return res; } private void btr(String tmp, List<String> res, int left, int right, int n) { if (left == n && right == n) { res.add(tmp); return; } if (left < n) btr(tmp + "(", res, left + 1, right, n); if (right < left) btr(tmp + ")", res, left, right + 1, n); }
解题思路二:分治法。假设要求的是n,可以用F(n)表示n对括号所有的组合,那么有F(n)="("+F(i)+")"+F(n-i-1),i∈[0,n-1],划分为两个子问题,左半部分被一个括号包裹,右半部分没有被括号包裹,于是可以求得组合。参考这里。
public List<String> generateParenthesis(int n) { LinkedList<String> res = new LinkedList<String>(); if (n == 0){ res.add(""); return res; } else if (n == 1){ res.add("()"); return res; } for(int i=n-1; i>=0; --i){ List<String> l = generateParenthesis(i); List<String> r = generateParenthesis(n-i-1); for(String l_str : l){ for(String r_str : r){ res.add("(" + l_str + ")" + r_str); } } } return res; }