题目

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,求出所有合法的表达式。

参考资料

用二叉树形象的表示这种关系。然后再把二叉树转化为代码的形式。因为二叉树的定义就是递归定义的,因此本题很明显应该使用递归的形式。

从上面的图片中我们可以很明显的看到,最后五条画黑线的就是最终的结果,其中左分支都是添加左括号,又分支都是添加右括号。

那么我们在什么情况下添加左括号呢?很明显,最多能添加n个左括号,在递归调用的时候,在能传递到最底层的共用字符串中先添加”(“,然后left-1,递归调用就可以。

那什么时候添加右括号呢?当左括号个数大于右括号的个数时添加右括号。

那我们是先添加右括号还是先添加左括号呢?对于这个问题,认真想想其实是无所谓的,只会影响在vector中最后字符串的顺序而已。

难度主要在以下几个方面:

1.想到二叉树,想到递归实现。

2.递归函数的参数形式要考虑清楚才可以。

AC代码

class Solution {
public:
vector<string> generateParenthesis(int n) {
if (n == 0)
return vector<string>(); vector<string > ret; dfs(ret, "", n, n); return ret;
} //利用二叉树递归思想
void dfs(vector<string> &ret, string tmp, int left, int right)
{
if (0 == left && 0 == right)
{
ret.push_back(tmp);
return;
}
else if (left > 0)
dfs(ret, tmp + '(', left - 1, right); if (left < right)
dfs(ret, tmp + ')', left, right - 1);
} };

GitHub测试程序源码

最新文章

  1. Android开发者的Kotlin:书
  2. lombok在IntelliJ IDEA下的使用
  3. 换个新的思路 代替解压jar包 例证:wechat4j 框架中的templateMsg类
  4. php 面试题收集-基础题
  5. table表格制作
  6. [转]SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
  7. php Memcache/Memcached操作手册
  8. 《一课经济学》书摘笔记IV
  9. ajax重写,js方法重新
  10. IIS 配置
  11. repter导出到Excel
  12. android ant 最简单的打包签名,混淆方法
  13. URI、URL和URN之间的区别与联系
  14. Android studio自动删除没用的资源
  15. A- Bear and Five Cards(codeforces ROUND356 DIV2)
  16. Html基础详解之(jquery)之二
  17. 快速增加controller节点
  18. ubuntu16.04安装eclipse后启动栏图标为问号
  19. CodeForces 721C Journey(拓扑排序+DP)
  20. 导出html table 数据到Excel

热门文章

  1. C#递归拷贝文件夹下文件以及文件夹
  2. iOS 让部分ViewController支持屏幕旋转
  3. JavaScript--数组常用方法总结
  4. SPRING-BOOT系列之SpringBoot快速入门
  5. list的一些功能
  6. MonoBehaviour生命周期
  7. ES-自然语言处理之中文分词器
  8. vue-cli下配置项目访问ip和服务器ip
  9. VS Code使用技巧整理
  10. Oracle逻辑备份与恢复(Data Pump)