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: ["((()))","(()())","(())()","()(())","()()()"]

Example 2:

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

题解:

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

n = 1, ()
n = 2, (()), ()()
n = 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]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值