• [LeetCode] 22. 括号生成 ☆☆☆(回溯)


    描述

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

    例如,给出 n = 3,生成结果为:

    [
    "((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
    ]

    解析

    对于此题,在帖子《以Generate Parentheses为例,backtrack的题到底该怎么去思考?》中,从前文提到的选择、限制、结束条件的角度出发,进行了专门的解释:

    该问题的选择:任何时刻都有两种选择:
    A. 加左括号
    B. 加右括号

    该问题的限制:
    A. 如果左括号已经用完,则不能再加左括号了;
    B. 如果已经出现的右括号和左括号一样多,则不能再加右括号了(因为这样的话新加入的右括号一定无法匹配);

    该问题的结束条件:
    左右括号全部用完;

    此外,还要考虑到该题的其他问题:
    结束之后的正确性:左右括号同时用完,一定是正解(一方面左右括号个数相等,另一方面每个右括号都一定有配对的左括号)。
    递归函数传入参数:
    A. 左右括号的数目(因为限制条件和结束条件中有“用完”“一样多”的字样);
    B. 当前字符串 tempStr,解集 list

    代码

    class Solution {
        public List<String> generateParenthesis(int n) {
            List<String> list = new ArrayList<>();
            int left = n;
            int right = n;
            generateParenthesisHelp("", list, left, right);
            return list;
        }
        
        public void generateParenthesisHelp(String tempStr, List<String> list, int left, int right) {
            if (left == 0 && right == 0) {
                list.add(tempStr);
                return;
            }
            if (right > left) {
                generateParenthesisHelp(tempStr + ")", list, left, right - 1);
            }
            if (left > 0) {
                generateParenthesisHelp(tempStr + "(", list, left - 1, right);
            }
        }
    }
  • 相关阅读:
    12306.cn网站自动登录器源代码
    从IL看C#
    CanvasRenderingContext2Dhtml5的关键
    慎用Response.Write()
    JPanel 的getGraphics
    怎么用swing绘图
    Win7 双硬盘启动出错处理
    paint repaint实现动画
    多线程一例
    画图,橡皮
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11196631.html
Copyright © 2020-2023  润新知