题目:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]
题解:
可以采用深度优先遍历递归法:
class Solution {
List<String> result=new ArrayList<>();
public List<String> generateParenthesis(int n) {
if(n==0) return result;
DFS_bracket("",n,n);
return result;
}
public void DFS_bracket(String curr,int left_num,int right_num){
if(left_num==0&&right_num==0){
result.add(curr);
}
if(left_num>right_num) return;//若右数量大于左则返回
if(right_num>0){
DFS_bracket(curr+")",left_num,right_num-1);
}
if(left_num>0){
DFS_bracket(curr+"(",left_num-1,right_num);
}
}
}
或者动态规划法,首先我们定义状态:dp[i]的意思是i对括号的所有情况,dp[0]=[""],dp[1]=["()"]
状态dp[n]相比较dp[n-1]多了一对括号,这对括号的左括号一定在最左 右括号一定可以将n-1对括号分开,所以状态迁移方程为:
dp[n] = “(” + dp[可能的括号对数p] + “)” + dp[剩下的括号对数q]
其中p+q=n-1
代码如下:
class Solution {
public List<String> generateParenthesis(int n) {
List<List<String>> dp=new ArrayList<>(n);
List<String> curr_0=new ArrayList<>();
curr_0.add("");
dp.add(curr_0);//初始化dp[0]
for(int i=1;i<=n;i++){
List<String> curr=new ArrayList<>();
for(int j=0;j<i;j++){
String now=new String();
for(String s1:dp.get(j)){
for(String s2:dp.get(i-j-1)){
now="("+s1+")"+s2;
curr.add(now);
}
}
}
dp.add(curr);
}
return dp.get(n);
}
}