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:
"((()))", "(()())", "(())()", "()(())", "()()()"
NP-probem-> Time O(#ofResult)
Pattern of Catalan number: form a sequence of natural
numbers that occur in various counting problems
Cn= (2n)! / (n+1)!n!
Idea: Loop-Recursion method
3 case
Invalid case: right<left since it is not allowed
Valid Case: recursive add ( bracket when left>0
recursive add ) bracket when right>0
Completed case: left==0 and right==0
public static ArrayList<String> generateParenthesis(int n) {
ArrayList<String> res=new ArrayList<String>();
helper(n,n,"",res);
return res;
}
public static void helper(int left, int right, String s, ArrayList<String> res){
//Invalid case that #ofRight should be always less than #ofLeft
if(right<left) return;
//A completed Parentheses set Generated
if(left==0 && right==0){
res.add(s);
}
//Valid case
//recursive adding left and right Parenthesis
if(left>0)
helper(left-1,right,s+"(",res);
if(right>0)
helper(left,right-1,s+")",res);
}