Leetcode——括号生成(深度优先遍历)

题目描述

在这里插入图片描述

题目分析

  • 本题采用的是回溯算法(深度优先遍历算法),在看了一些博客之后,我对深度优先的理解是,往尽可能深的方向搜索,有点像二叉树的前序遍历,搜索停止的标志是到达边界或者找到结果。而之所以称为“回溯”,是在往一个方向搜索结束后,要跳转回上一节点,继续往其他方向搜索。
  • 在这一题中,由于字符串的每一次拼接都生成一个新的对象,因此不必回溯。到达每一个节点时,我们都有两种选择,一是加上左括号,二是加上右括号,也就是有两个搜索方向。所以整个问题就变成了一个像二叉树一样的问题,沿着左右搜索,树的深度就是字符串的长度。
  • 另外,还有一个关键点是剪枝,也就是某个节点不符合要求时直接退出,不用再继续搜索浪费资源。在题目中,就是字符串中右括号大于左括号的时候,此时我们应该直接退出循环。

题目解答

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);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/fucccck_ly/article/details/105411748