[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);
        }
    }
}
原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11196631.html