[4]括号生成
A.回溯法
a.图解
![请添加图片描述](https://img-blog.csdnimg.cn/55cca36e56fe4c72ab8a2c76a2f8f3e4.jpeg)
b.伪代码
fun(n)[]://n括号对数
result=[]
backtracking(n,result,0,0,"")
return result
backtracking(n,result,left,right,str)
if right>left://不合法
return
if left==right==n://合法且已生成所有
result.add(str)
return
if left<n://添加左括号
backtracking(n,result,left+1,right,str+"(")
if right<left://添加右括号
backtracking(n,result,left,right+1,str+"(")
c.源码
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
backtracking(n, result, 0, 0, "");
return result;
}
private void backtracking(int n, List<String> result, int left, int right, String str) {
if (right > left) {
return;
}
if (left == n && right == n) {
result.add(str);
return;
}
if (left < n) {
backtracking(n, result, left+1, right, str+"(");
}
if (right < left) {
backtracking(n, result, left, right+1, str+")");
}
}
}