• 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
  • 相关阅读:
    c++ unordered_map和map的区别
    远程桌面登录Windows云服务器报错0x112f
    AOP中的一些重要术语简介
    Evil靶场
    AUTODL云服务器使用大致步骤(适合本人版)
    C#__文件操作之FileInfo和DirectoryInfo
    一文帮你掌握vue3这些核心知识点
    使用html+css实现一个静态页面【传统文化茶带音乐6页】HTML学生个人网站作业设计
    深入探究 npm cache 命令:用途与实践指南
    具体项目下解决Echarts多端同步开发和维护的问题
  • 原文地址:https://blog.csdn.net/codeman_cdb/article/details/126615486