描述
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
“((()))”, “(()())”, “(())()”, “()()()”, “()(())”,
分析
使用回溯的方式每次给传递过来的str增添一个"(“或者”)"。使用left、right表示左右括号剩余的数量。
当left == 0、right == 0时表示生成括号结束了。
当left > 0可以在str的右边添加"("。
当left < right 并且 right > 0可以在str的右边添加")"。
因为是每一时刻的左括号的数量总是大于等于右括号的数量,所以生成的括号一定是合格。
import java.util.*;
public class Solution {
public ArrayList<String> generateParenthesis (int n) {
if(n == 0){
return null;
}
ArrayList<String> list = new ArrayList<String>();
getHesis("", list, n, n);
return list;
}
public void getHesis(String str, ArrayList<String> list, int left, int right){
if(left == 0 && right == 0){
list.add(str);
return ;
}
if(left > 0){
getHesis(str + "(", list, left - 1, right);
}
if(right > 0 && right > left){
getHesis(str + ")", list, left, right - 1);
}
return ;
}
}