打卡,第15天
今天做了一道比较好玩的题,之前有做个一个括号匹配的题目,今天的题目刚好反过来,不是验证括号是否正确,而是生成正确括号——Generate Parentheses.
题目描述:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
再看看n = 2
时:
我们观察上面的例子,可以发现n=3,其实是由n=2加上一个()
组合起来的,可以分成三种情况:
- 在前面加上
()
,
- 在后面加上
()
,
- 在前面加上
(
后面加上)
我们大概可以写出这样的代码:
这样在n <= 3
时是ok的,但是如果n = 4
还有一种可能,就是(())(())
,这时由两个n=2
的括号组合而成的,以及n = 5
时,可以由n = 3
和n = 2
组合而成,也可以由n = 1
和n = 4
组合而成。
故我们可以做以下改进,得到正确答案:
可以发现,这里出现了很多次重复计算,可以用动态规划去做:
然后是在discuss
中看到的另一种思路:
这个的想法是,不断的生成左括号,有左括号,后面就一定会生成一个右括号。