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:
"((()))", "(()())", "(())()", "()(())", "()()()"
Java:
自己写的:
public class Solution {
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> res= new ArrayList<String>();
help(n,n,"",res);
return res;
}
public void help(int l, int r, String s, ArrayList<String> res){
if(r<l) return;
if(l==0&&r==0)
{
res.add(s);
}
if(l>0)
help(l-1,r,s+"(",res);
if(r>0)
help(l,r-1,s+")",res);
}
}
没有征服代码的n<=0判断 也能过
1. 征服代码: http://blog.youkuaiyun.com/linhuanmars/article/details/19873463
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> res = new ArrayList<String>();
if(n<=0)
return res;
helper(n,n,new String(),res);
return res;
}
private void helper(int l, int r, String item, ArrayList<String> res)
{
if(r<l)
return;
if(l==0 && r==0)
{
res.add(item);
}
if(l>0)
helper(l-1,r,item+"(",res);
if(r>0)
helper(l,r-1,item+")",res);
}
2.http://blog.youkuaiyun.com/fightforyourdream/article/details/14159435
public class Solution{
public static ArrayList<String> generateParenthesis(int n) {
ArrayList<String> list = new ArrayList<String>();
rec(n, 0, 0, "", list);
return list;
}
public static void rec(int n, int left, int right, String s, ArrayList<String> list){
// invariant必须满足左括号数目要大等于右括号数目
if(left < right){
return;
}
// 如果左右括号数目相等则添加到list
if(left==n && right==n){
list.add(s);
return;
}
// 左括号已满,只能添加右括号
if(left == n){
rec(n, left, right+1, s+")", list);
return;
}
rec(n, left+1, right, s+"(", list); // 继续添加左括号
rec(n, left, right+1, s+")", list); // 继续添加右括号
}
}