「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」
前言
今日的题目为中等,因为每日一题为困难,并且难度稍大,没有时间去进行解答,所以只好找了一道简单点的动态规划题进行替换。
每日一题
今天的每日一题 22. 括号生成,难度为中等
- 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
- 1 <= n <= 8
题解
简单模拟解析
由于题目给出的数据范围较小,- 1 <= n <= 8,所以我们可以考虑使用递增的做法,就是当 n 为 1 的时候括号会是怎么样的,当 n = 2 的时候,括号会是怎么样的,以此类推去找每两个相邻的 n 之间的联系来进行解题,因为 n 最多为 8 所以数据运行时间也不会超时。
我们需要先去遍历 n-1 的括号情况,n 就是在 n-1 的基础上多添加了一对括号,只要遍历 n 所以的括号出现的情况,然后在每一种情况的每一个能放入括号的地方加入一对括号,这就是 n 的一种情况,然后我们能知道 n=1 的时候答案为 () 所以以此能往上推出 n=2,n=3 等等的情况下的答案。
我们打一个比方,比如说现在 n 为 1,那么我们可以得到这种情况下的括号为 (),我们可以在下图三个地方插入第二对括号形成 n=2 的三种情况:
然后对 n=2 的到的三种情况进行一个去重,我们就能够得到 n=2 时的所以括号情况。
简单模拟解题
在 n=2 之后的括号情况会出现多种,那么我们在第 n 位添加不同位置括号的时候就也需要将多种情况都考虑进去,比如现在要由 n=2 得到 n=3 的情况下:
也是得到每一个情况之后再去做一个数组去重,这样就能够得到 n=3 的所有情况。
所以按照上面的思路,我们来做这道题:
-
先新建一个 set 表用于保存 n-1 的数据,初始就是 n=1 :
() -
接着按照传入的 n 来进行循环
-
在循环中要新建一个 set 表用于保存当前 n 的数据
-
循环 n-1 的所有括号情况
-
循环每一种括号情况的字符串
-
在字符串的每一个位置拼接加入
()并且存入存放当前 n 的 set 表中 -
最后得到的当前 set 表就是我们需要的答案,利用 set 表的特性进行自动去重
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function (n) {
let oldSet = new Set(['()']);
for (let i = 2; i <= n; i++) {
let newSet = new Set();
for (let s of oldSet) {
for (let j = 0; j <= s.length; j++) {
newSet.add(s.slice(0, j) + '()' + s.slice(j));
}
}
oldSet = newSet;
}
return [...oldSet];
};