要点:必须满足左括号数目要大等于右括号数目
典型的递归题,画出图来就很好理解。1,2分别对应着两种特殊情况。
package Level3;
import java.util.ArrayList;
/**
* Generate Parentheses
*
* 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 S22 {
public static void main(String[] args) {
System.out.println(generateParenthesis(3));
}
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); // 继续添加右括号
}
}
Again:
一种新的写法,left,right表示手上有的左右括号括号数量。因此条件要改变一些。
public class Solution {
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> ret = new ArrayList<String>();
rec(n, n, "", ret);
return ret;
}
public void rec(int left, int right, String s, ArrayList<String> ret){
if(left==0 && right==0){
ret.add(s);
return;
}
if(left==0){
rec(left, right-1, s+")", ret);
return;
}
if(right==0){
return;
}
if(left > right){
return;
}
rec(left-1, right, s+"(", ret);
rec(left, right-1, s+")", ret);
}
}