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:
"((()))", "(()())", "(())()", "()(())", "()()()"
public class Solution {
List<String> result=new LinkedList<String>();
public List<String> generateParenthesis(int n) {
if(n==0)return null;
mygenerateParenthesis(n,n,0,0,new char[2*n]); //should add dimension when create a string
return result;
}
public void mygenerateParenthesis(int n,int left,int right,int num, char[] cur){
if(left>0){
cur[num]='(';
left--;
right++;
num++;
mygenerateParenthesis(n,left,right,num,cur);
left++;right--;num--; //undo effect
}
if(right>0&&num<=2*n-1){
cur[num]=')';
right--;num++;
mygenerateParenthesis(n,left,right,num,cur);
right++;num--;
}
else if(num>2*n-1){
result.add(new String(cur));
}
}
}
思路:每一步可能有两个选择,左括号或者是右括号。
用left记录可以用的左括号的数目,用right记录可以用的右括号的数目。只有先用了一个左括号以后,才能再有一个右括号。
同时,backtracing,不要忘记每一步的选择过后,要undo effect.
在最后面处理最后的情况,或者中间也可以。