LeetCode 22 括号生成

101 阅读1分钟

一、括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n=1
输出:["()"]

二、解题思路

public class Solution {
    public IList<string> GenerateParenthesis(int n) {
        //创建一个列表,最终存储结果集
         List<String> result = new List<String>();
         //调用静态方法,n代表需要组成的括号次数
        backtracking(n, result, 0, 0, "");
        //返回最终列表结果
        return result;
    }
    public static void backtracking(int n, List<String> result, int left, int right, String str) {
        //如果右边括号次数大于左边的括号次数,表明当前是不成立的,直接return,执行下一次
        if (right > left) {
            return;
        }
        //如果当前左括号等于要组成的括号次数,并且当前右括号等于要组成的括号次数,则表示当前满足结果集,添加到列表中即可
        if (left == n && right == n) {
            result.Add(str);
            return;
        }
        //如果左括号次数小于组成括号的次数,表明还有左括号与之有括号对应,继续调用自身,递归
        if (left < n) {
            //做括号次数加1,同时str补齐左括号
            backtracking(n, result, left+1, right, str+"(");
        }
        //如果右括号次数小于左括号次数,表明还有右括号要与左括号对应,继续递归配对
        if (right < left) {
            //右括号次数加1,同时str补齐右括号
            backtracking(n, result, left, right+1, str+")");
        }
    }
}