方法一:DFS
public List<String> generateParenthesis(int n) {
List<String> list=new LinkedList<>();
if(n==0) return list;
dfs("",0,0,n,list);
return list;
}
public void dfs(String str,int left,int right,int n,List<String> list){
if(left==n&&right==n){
list.add(str);
return;
}
if(left<right){
return;
}
if(left<n){
dfs(str+"(",left+1,right,n,list);
}
if(right<n){
dfs(str+")",left,right+1,n,list);
}
}
方法二:BFS
public List<String> generateParenthesis(int n){
List<String> list=new LinkedList<>();
if(n==0) return list;
Queue<Node> queue=new LinkedList<>();
queue.offer(new Node("",0,0));
while(!queue.isEmpty()){
Node node=queue.poll();
if(node.left==n&&node.right==n){
list.add(node.res);
}
if(node.left<n){
queue.offer(new Node(node.res+"(",node.left+1,node.right));
}
if(node.right<n&&node.left>node.right)
{
queue.offer(new Node(node.res+")",node.left,node.right+1));
}
}
return list;
}
class Node{
String res;
int left;
int right;
public Node(String res,int left,int right){
this.res=res;
this.left=left;
this.right=right;
}
}
方法三:动态规划
思路:res中存储下标值对应的括号对数量的全部排列。
public List<String> generateParenthesis(int n){
List<List<String>> res=new LinkedList<>();
if(n==0) return res.get(0);
List<String> list0=new LinkedList<>();
list0.add("");
res.add(list0);
List<String> list1=new LinkedList<>();
list1.add("()");
res.add(list1);
for(int i=2;i<=n;i++){
List<String> temp=new LinkedList<>();
for(int j=0;j<i;j++){
List<String> str1=res.get(j);
List<String> str2=res.get(i-j-1);
for(String s1:str1){
for(String s2:str2){
String str="("+s1+")"+s2;
temp.add(str);
}
}
}
res.add(temp);
}
return res.get(n);
}