LeetCode 22. Generate Parentheses
Posted CrazyCoder1992
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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种:
- 整个字符串为一个大整体,即第一个 “(” 对应最后一个 “)”,不可切割;
- 字符串由多个合法的括号组合进行拼接组成,即可切割为多个子字符串,每个字符串都是合法的括号组合。
进一步分析,可得:
- 第一种字符串由其上方一层的字符串在外围使用一对括号包裹得到;
- 第二种字符串由其上方多层中的某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(i−1)+‘‘)",Σ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]
以上是关于LeetCode 22. Generate Parentheses的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 22. Generate Parentheses
leetcode22. Generate Parentheses
leetcode 22 -- Generate Parentheses
[leetcode-22-Generate Parentheses]