算法系列-第二十二题

40 阅读1分钟

题目名称:括号生成

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

示例 1:

输入:n = 3

输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1

输出:["()"]


/**

* 解法一:递归

* 思路:

* (1)如果使用了一个左括号以后,那么还剩下n-1个左括号和n个右括号,也是将这些括号连接成-一个字符串,就相当于是原问题的子问题,因此我们使用递归。

* (2)但是这样递归不能保证括号一 定合法,我们需要保证左括号出现的次数比右括号多时我们再使用右括号就一定能保证括号合法了,

* 因此每次需要检查左括号和右括号的使用次数。

* 时间复杂度:复杂度取决于有多少个合法括号组合

* 空间复杂度:O(n),递归栈最大空间,其中res数组是返回时必须要的,不算额外空间

*/

function generateParenthesis(n: number): string[] {

const res: string[] = [];

resursion(0, 0, "", res, n);

return res;

}

function resursion(

left: number,

right: number,

temp: string,

res: string[],

n: number

): string[] {

if (left === n && right === n) {

res.push(temp);

return;

}

if (left < n) {

resursion(left + 1, right, temp + "(", res, n);

}

if (right < n && left > right) {

resursion(left, right + 1, temp + ")", res, n);

}

}