【LeetCode笔记】22.括号生成(Java、DFS回溯、剪枝、括号)

题目描述

  • 先吐槽:括号题好恶心。。
  • 括号有效判断需要考虑考虑
    在这里插入图片描述

代码 & 解法

  • 思路:把括号分开看,这道题和20.有效的括号其实是有差别的:这道题的括号是成对的,而20题的括号则没有这个硬性要求。
    基于此,我们可以用这么一个思路去考虑这道题:分配一个大小为2n的括号集,其中n个是左括号,n个是右括号
  • 递归过程中需要剪枝,递归结束时获得答案
  • 结果正确性:见代码注释1.2.
class Solution {
    public List<String> generateParenthesis(int n) {
        /**
            1. 如何确保不重复:画格子,走不同分枝肯定至少有一个格子不同。如下
            	    [x][x][o][x]
            	    [x][x][o][o]
               也就是无论如何,不同分枝代表的字符串内容肯定不相同。
            2. 如何跑全:因为包括了所有左右括号组合。
        */

        ArrayList<String> ans = new ArrayList<>();
        dfs(ans, n, n, "");
        return ans;
    }

    // ans(存储答案);left(左括号剩余数);right(右括号剩余数);now(当前字符串)
    public void dfs(ArrayList<String> ans, int left, int right, String now) {
        // 递归结束
        if (left == 0 && right == 0) {
            ans.add(now);
        }
        // 剪枝情况:如")",肯定是错误顺序。
        if (right < left) {
            return;
        }
        // 走左括号路线
        if(left > 0){
            dfs(ans, left - 1, right, now + "(");
        }
        // 走右括号路线
        if(right > 0){
            dfs(ans, left, right - 1, now + ")");
        }
        return;
    }
}

版权声明:本文为qq_45108415原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。