描述
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路
对于重复内容顺序的生成,可以采用递归的方式。生成括号部分可以进行递归,具体递归过程如下图:图源

如图,进行递归需要设计递归的出口,在本问题中,出口为右括号的数量超过左括号(非法情况)、左括号的数量等于右括号的数量等于0(合法情况,加入输出队列)。其他情况可以当做中间过程进行处理。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new LinkedList<String>();
//递归的开始
add(n, n, "", result);
return result;
}
//前两个整型数据是剩余左右括号数,current为当前的组合,result为结果集
public void add(int left, int right, String current, List<String> result){
//如果剩余左括号数大于右括号,说明当前是非法情况
if(left > right){
return;
}
//完整的合法情况,左右括号组合完成
if(left == 0 && right == 0){
result.add(current);
return;
}
//当左右括号不为0,分别尝试左右括号加上的情况
if(left > 0){
add(left-1, right, current+"(", result);
}
if(right > 0){
add(left, right-1, current+")", result);
}
}
}Runtime: 1 ms, faster than 82.00% of Java online submissions for Generate Parentheses.
Memory Usage: 39.8 MB, less than 17.42% of Java online submissions for Generate Parentheses.
解法的关键在于将穷举所有情况的思想转换为递归思想的过程。也是穷举法的一种方式。