• LeetCode 22. Generate Parentheses


    Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

    Example 1:

    Input: n = 3
    Output: ["((()))","(()())","(())()","()(())","()()()"]
    
    • 1
    • 2

    Example 2:

    Input: n = 1
    Output: ["()"]
    
    • 1
    • 2

    题解:

    读题理解提议,题目要求为列举出包含n对括号的所有组合,并按字典顺序输出,看起来并不像一道动态规划题。
    在没有思路的情况下,首先列举出简单场景,寻找其中的规律。

    n = 1, ()
    n = 2, (()), ()()
    n = 3, ((())), (()()), (())(), ()(()), ()()()
    
    • 1
    • 2
    • 3

    通过观察可以发现,括号组合可简单分为以下2种:

    1. 整个字符串为一个大整体,即第一个 “(” 对应最后一个 “)”,不可切割;
    2. 字符串由多个合法的括号组合进行拼接组成,即可切割为多个子字符串,每个字符串都是合法的括号组合。

    进一步分析,可得:

    1. 第一种字符串由其上方一层的字符串在外围使用一对括号包裹得到;
    2. 第二种字符串由其上方多层中的某2个字符串前后拼接而成,其括号的个数是那2个字符串的括号个数之和。

    假设 f ( i ) f(i) f(i) 代表 n = i n = i n=i 时的结果,可得到以下递推公式:
    f ( 1 ) = [ ‘ ‘ ( ) " ] f(1) = [``()"] f(1)=[‘‘()"]
    f ( i ) = s o r t ( d i s t i n c t ( [ ‘ ‘ ( " + Σ f ( i − 1 ) + ‘ ‘ ) " , Σ f ( j ) + Σ f ( k ) ] ) ) , 其中 i = j + k f(i) = sort(distinct([ ``(" + \Sigma f(i-1) + ``)", \Sigma f(j) + \Sigma f(k)])), 其中 i = j + k f(i)=sort(distinct([‘‘("+Σf(i1)+‘‘)",Σf(j)+Σf(k)])),其中i=j+k

    接下来再根据递推公式编程就很简单了:

    import "sort"
    
    func generateParenthesis(n int) []string {
    	prths := make([][]string, n)
    	var set map[string]bool
    	for i := 1; i <= n; i++ {
    		if i == 1 {
    			prths[i-1] = []string{"()"}
    			continue
    		}
    
    		set = map[string]bool{}
    		for _, p := range prths[i-2] {
    			set["("+p+")"] = true
    			for j := 1; j < i; j++ {
    				k := i - j
    				if j > k {
    					break
    				}
    				for _, pj := range prths[j-1] {
    					for _, pk := range prths[k-1] {
    						set[pj+pk] = true
    						set[pk+pj] = true
    					}
    				}
    			}
    		}
    		tmpPrths := make([]string, 0)
    		for p := range set {
    			tmpPrths = append(tmpPrths, p)
    		}
    		sort.Strings(tmpPrths)
    		prths[i-1] = tmpPrths
    	}
    	return prths[n-1]
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    Dockerfil 构建上下文 build -f 选项 加快构建速度
    外汇天眼:CySEC向塞浦路斯投资公司的董事会成员发出警告
    tidymodels搞定二分类资料多个模型评价和比较
    程序公司商业合作保密协议书
    三大对象的常用属性和方法【常更新】
    Apache ShardingSphere 5.1.1 正式发布
    Windows系统创建Python虚拟环境
    JavaScript之正则表达式
    三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析
    Mac硬盘检测工具
  • 原文地址:https://blog.csdn.net/codeman_cdb/article/details/126615486