很简单的一道问题,就是个DFS(深度优先搜索)的问题,我能想到,但是我不会。。。
所以结合本题总结下递归和DFS的解决方法。
如下图,执行的时候按从左到右的顺序,先递归执行左子树,再递归执行右子树。
代码如下:
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
dfs(n, n, "", result);
return result;
}
public static void dfs(int lefts, int rights, String s, List<String> result){
//递归出口,找到了一个正确结果
if (lefts == 0 && rights == 0){
result.add(s);
}
//第一次递归,左子树
if (lefts > 0) {
dfs(lefts-1, rights, s+'(', result);
}
//第二次递归,右子树
if (rights > 0 && lefts < rights) {
dfs(lefts, rights-1, s+')', result);
}
//隐藏出口,就是各种不合法的结果,比如lefts>rights,左括号有富余
}
public static void main(String[] args) {
Solution solution = new Solution();
List<String> result = solution.generateParenthesis(2);
System.out.println(result);
}
}