【算法】打印N对合理括号组合
2016-04-27 22:45
615 查看
题目:打印N对合理括号组合,比如输入3 输出
((()))
()(())
()()()
(())()
(()())
思想:无疑是分治法了,具体来说是考虑要记录的状态一共有left,right,还有写入的位置Pos
然后考虑什么时候可以插入’(‘:当left只要不为0,理论上来说是可以一直插入的。这样不算违规。
再考虑什么时候不可以插入’)’:呃,肯定考虑什么时候不能插入右边吧。当发现形如())这样的就算犯规了,或者说插入的right > 插入的left,剩余的right < 剩余的left。。。。
所以反过来,当剩余的right > 剩余的left时候就可以随便插入了
((()))
()(())
()()()
(())()
(()())
void PrinAr(char *str,int pos,int left,int right) {//pos为写入的位置 if(NULL == str || left < 0 || right < left) return; if(left == 0 && right == 0) { cout<<str<<endl;//写入完毕 return ; } if(left > 0)//插入左括号的情况 { str[pos] = '('; PrinAr(str,pos+1,left-1,right); } if(right > left)//插入右括号的情况 { str[pos] = ')'; PrinAr(str,pos+1,left,right-1); } } void PrinAr(int n) { char *str = new char[2*n+1]; str[2*n] = '\0'; PrinAr(str,0,n,n); delete []str; }
思想:无疑是分治法了,具体来说是考虑要记录的状态一共有left,right,还有写入的位置Pos
然后考虑什么时候可以插入’(‘:当left只要不为0,理论上来说是可以一直插入的。这样不算违规。
再考虑什么时候不可以插入’)’:呃,肯定考虑什么时候不能插入右边吧。当发现形如())这样的就算犯规了,或者说插入的right > 插入的left,剩余的right < 剩余的left。。。。
所以反过来,当剩余的right > 剩余的left时候就可以随便插入了
相关文章推荐
- zip无法解压
- 项目总结
- 使用xutils实现多线程下载
- GDOI最后一次终极模拟赛总结
- Spring MVC web.xml 配置文件配置
- Jps常用命令整理
- C#类中索引器的使用
- h5学习笔记:line-height和height组合居中
- 7-1 Verilog 计时器
- 基类RecyclerViewAdapter以及BaseViewHolder。减少适配器的重复代码量
- (多核DSP快速入门)5.SYS/BIOS的使用实例分析
- EntityFrameWork 从入门到熟悉(2)-简单增删改查
- myibatis中出现“@P0' 附近有语法错误。”
- git rebase简介(基本篇)
- ubuntu下git安装及使用
- 习题三1011
- C++ deques
- File类的使用
- android,闹钟定时功能,实现过程
- 不可变类