题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
题解:深度优先遍历
- 「回溯算法」是「树行问题」上的「深度优先遍历」;
- 用一个变量去搜索所有可能的情况,理解「回溯算法」,脑子里要建立一个形象的动画,想象一根绳子在走迷宫的时候变长变短,变短就是「回溯」、「撤销选择」的意思;
- 很多基础的「回溯」问题,先要画图,然后写代码就容易很多。
递归三要素:
1、终止条件
2、返回值
3、本级递归内容
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
String str = "";
dfs(n, n, res, str);
return res;
}
private void dfs(int l, int r, List<String> res, String str) {
//成功条件
if (l == 0 && r == 0) {
res.add(str);
return;
}
//如果左边>0,则拼接左边的括号
if (l > 0) {
dfs(l - 1, r, res, str + "(");
}
//如果右边>左边,则拼接右边的括号
if (r > l) {
dfs(l, r - 1, res, str + ")");
}
}
}
public class Main {
public static void main(String[] args) {
int n = 3;
Solution p = new Solution();
List<String> b = p.generateParenthesis(n);
System.out.println("结果:" + b);
}
}