题目描述
题目分析
- 本题采用的是回溯算法(深度优先遍历算法),在看了一些博客之后,我对深度优先的理解是,往尽可能深的方向搜索,有点像二叉树的前序遍历,搜索停止的标志是到达边界或者找到结果。而之所以称为“回溯”,是在往一个方向搜索结束后,要跳转回上一节点,继续往其他方向搜索。
- 在这一题中,由于字符串的每一次拼接都生成一个新的对象,因此不必回溯。到达每一个节点时,我们都有两种选择,一是加上左括号,二是加上右括号,也就是有两个搜索方向。所以整个问题就变成了一个像二叉树一样的问题,沿着左右搜索,树的深度就是字符串的长度。
- 另外,还有一个关键点是剪枝,也就是某个节点不符合要求时直接退出,不用再继续搜索浪费资源。在题目中,就是字符串中右括号大于左括号的时候,此时我们应该直接退出循环。
题目解答
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res=new ArrayList<String>();
if(n==0) return res;
dfs("",n,n,res);
return res;
}
public static void dfs(String cur,int left,int right,List<String> res){
if(left==0&&right==0){
res.add(cur);
return;
}
if(left>right){
return;
}
if(left>0){
dfs(cur+"(",left-1,right,res);
}
if(right>0){
dfs(cur+")",left,right-1,res);
}
}
}