题目如下
理解:不能先出现右括号,且出现的右括号数量不能超过当前左括号数量。
例:不能()) 或 )(
采用深度优先算法思想:
(1):加法运算,从0开始,每次递归加1。终止条件为:左括号和右括号数量都等于n,或左括号数量小于右括号。
例:设n=3 ()) 这种情况:左括号个数为1,右括号个数为2 不符合情况
import java.util.*;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
if (n == 0) {
return res;
}
// 执行深度优先遍历,搜索可能的结果
dfs("", 0, 0, n, res);
return res;
}
/**
left为左括号个数,right为右括号个数,n为括号总数
*/
private void dfs(String curStr, int left, int right,int n, List<String> res) {
if(left ==n&&right ==n){
res.add(curStr);
return;
}
if(left<right){
return;
}
if(left<=n){
dfs(curStr+"(",left+1,right,n,res);
}
if(right<=n){
dfs(curStr+")",left,right+1,n,res);
}
}
}
(2):减法运算,从n开始,每次递归减1。终止条件为左括号个数等于右括号个数等于n或 左括号个数大于右括号。
例:设n=3 , ()) 这种情况:左括号个数为2,右括号个数为1 不合情况
import java.util.*;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
if (n == 0) {
return res;
}
// 执行深度优先遍历,搜索可能的结果
dfs("", n, n,res);
return res;
}
/**
left为左括号个数,right为右括号个数
*/
private void dfs(String curStr, int left, int right, List<String> res) {
if(left ==n&&right ==n){
res.add(curStr);
return;
}
if(left>right){
return;
}
if(left>0){
dfs(curStr+"(",left-1,right,res);
}
if(right>0){
dfs(curStr+")",left,right-1,res);
}
}
}