题目:
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
一开始我以为用PhoneNumber那道题的递归就可以了,但是这样做会出现重复,也会出现漏选,比如n=4时,(())(())这种序列,从n=3的结果使推不出来的。
我们应注意到,合法串的判断条件应该是左括号的数量left>= 右括号数right,且都小于等于n,若left=n,接下来的路径就只有right+1(即string s+“)”)而已,当left = right = n时,就把s添加的solution set中,其他的情况下,递归left+1,和right+1这两条路径即可。
import java.util.ArrayList;
import java.util.List;
public class No21_GenerateParentheses {
public static void main(String[] args){
System.out.println(generateParenthesis(4));
}
public static List<String> generateParenthesis(int n) {
List<String> ret = new ArrayList<String>();
String s = "";
generate(n, 0, 0, s, ret);
return ret;
}
public static void generate(int n, int left, int right, String s, List<String> list){
if(left < right) return;
if(left == n && right == n){
list.add(s);
return;
}
if(left == n && right < n){
generate(n, left, right+1, s+")", list);
return;
}
generate(n, left+1, right, s+"(", list);
generate(n, left, right+1, s+")", list);
}
}