leetcode刷题记录-22. 括号生成-动态规划

161 阅读3分钟

「这是我参与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 的三种情况:

image.png

然后对 n=2 的到的三种情况进行一个去重,我们就能够得到 n=2 时的所以括号情况。

简单模拟解题

在 n=2 之后的括号情况会出现多种,那么我们在第 n 位添加不同位置括号的时候就也需要将多种情况都考虑进去,比如现在要由 n=2 得到 n=3 的情况下:

image.png

也是得到每一个情况之后再去做一个数组去重,这样就能够得到 n=3 的所有情况。

所以按照上面的思路,我们来做这道题:

  1. 先新建一个 set 表用于保存 n-1 的数据,初始就是 n=1 : ()

  2. 接着按照传入的 n 来进行循环

  3. 在循环中要新建一个 set 表用于保存当前 n 的数据

  4. 循环 n-1 的所有括号情况

  5. 循环每一种括号情况的字符串

  6. 在字符串的每一个位置拼接加入 () 并且存入存放当前 n 的 set 表中

  7. 最后得到的当前 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];
};

image.png