美文网首页
动态规划:22.括号生成

动态规划:22.括号生成

作者: zmfflying | 来源:发表于2021-03-29 18:38 被阅读0次

/**

题目

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

示例 1:

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

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

提示:

1 <= n <= 8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

测试代码

print(generateParenthesis(3))

笔记

这道题我的初始思路是
dp[n] 和 dp[n-1] 的区别是增加了一个 ()
而最左边肯定就是 (
那么是不是每次把新增的这个 ( 固定的放在最左边
只要处理新增的这个 ) 的位置就好了呢

比如 dp[1] = [["(",")"]]
dp[2] 的时候
) 在第0个位置 [")","(",")"], 再加上新增的 ( 就是: ["(",")","(",")"]
) 在第1个位置 ["(",")",")"], 再加上新增的 ( 就是: ["(","(",")",")"]

所以 dp[2] = [["(",")","(",")"], ["(","(",")",")"]
根据这个规律就可以得出 dp[n] 的值
最后再把 dp[n] 转为 [String] 就是最终结果了

但是中间会出现一些重复的数据,需要做去重的操作
比如: 计算 dp[3] 对 ["(","(",")",")"] 进行处理的时候
) 在第2个位置 和 第3个位置都是 ["(","(","(",")",")",")"]

优化思路:
dp[0] = [""]
dp[1] = ["()"]
dp[2] = ["()()", "(())"]

还是把新增的 ( 放在最左边
对 dp[2] 来讲
) 在第 0 个位置就是 ( + dp[0] + ) + dp[1], 即 "()()"
) 在第 1 个位置就是 ( + dp[1] + ) + dp[0], 即 "(())"

得出的公式就是
dp[n] = ( + dp[i]的每一个元素 + ) + dp[n-1-i]的每一个元素


for s1 in dp[j] {
for s2 in dp[i-j-1] {
let tempStr = "(" + s1 + ")" + s2
}
}

代码地址

https://github.com/zmfflying/ZMathCode
*/

解题代码

import Foundation

//初始思路
func generateParenthesis(_ n: Int) -> [String] {
    if n == 1 {
        return ["()"]
    }
    
    //把新增的括号拆分成字符来处理 "()" -> ["(",")"]
    var dp = [Set<[Character]>].init(repeating: [], count: n+1)
    dp[1] = [["(",")"]]
    for i in 2...n {
        var tempArr:Set<[Character]> = []
        for arr in dp[i-1] {
            for j in 0..<arr.count {
                var temp = arr
                //字符 ) 插入到每一个位置
                temp.insert(")", at:j)
                //然后前面补上 (
                temp.insert("(", at: 0)
                tempArr.insert(temp)
            }
        }
        dp[i] = tempArr
    }
    //dp 里是字符的集合 需要转为题目要求的字符串数组
    var res:[String] = [String]()
    for set in dp.last! {
        let str = String.init(set[0..<set.count])
        res.append(str)
    }
    return res
}


//优化
func generateParenthesis1(_ n: Int) -> [String] {
    if n == 1 {
        return ["()"]
    }
    
    var dp = [[String]].init(repeating: [""], count: n+1)
    dp[1] = ["()"]
    for i in 2...n {
        var tempArr:[String] = []
        
        //重要 dp[n] = ( + dp[i]的每一个元素 + ) + dp[n-1-i]的每一个元素
        for j in 0..<i {
            for s1 in dp[j] {
                for s2 in dp[i-j-1] {
                    let tempStr = "(" + s1 + ")" + s2
                    tempArr.append(tempStr)
                }
            }
        }
        dp[i] = tempArr
    }
    return dp[n]
}

相关文章

  • 22. 括号生成-动态规划

    https://leetcode-cn.com/problems/generate-parentheses/ 我的...

  • 动态规划:22.括号生成

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

  • LeetCode-22. 括号生成

    参考:第7课-泛型递归、树的递归 LeetCode-22. 括号生成 22. 括号生成 数字 n 代表生成括号的对...

  • LeetCodeDay51 —— 括号生成★★☆

    22. 括号生成 描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。...

  • leetcode(python)22.括号生成

    22.括号生成 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,...

  • 22. 括号生成

    22. 括号生成[https://leetcode.cn/problems/generate-parenthese...

  • [day7] [LeetCode] [title22,3,26]

    22.括号生成 给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出...

  • 每周 ARTS 第 24 期

    1. Algorithm 22. 生成括号(中等) 描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能...

  • LeetCode:22. 括号生成

    问题链接 22. 括号生成[https://leetcode.cn/problems/generate-paren...

  • 22. 括号生成

    给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出n=3,生成结果...

网友评论

      本文标题:动态规划:22.括号生成

      本文链接:https://www.haomeiwen.com/subject/tsabhltx.html