22. Generate Parentheses
2015-07-02 22:17
369 查看
这道题目,我是通过DFS来做的,但是为了判断由N个“(”和N个")"生成的字符串是否合法,于是我又写了个函数ifNormal。ifNormal函数的复杂度为为O(N)。而实际上,根本不需要另外写ifNormal函数。那怎么判断生成的字符串是否合法,或者从在程序逻辑上根本不允许生成那些不合法的字符串呢?答案就是在DFS的时候,如果"("的数量小于N,那么就可以继续放"(",如果")"的数量小于"("的数量,也可以选择放")"。为什么")"的数量要小于"("的数量才能选择放")"呢?因为"("和")"是成对的,任何一个")"在前面都必有一个相应的"("。所以只有当")"的数量小于"("的数量时,才可以选择放")"。我原来的代码如下:
修改后的代码如下:
bool ifNormal(string& item) { stack<char> seq; for (int i=0; i<item.size(); i++) { if (item[i] == '(') { seq.push(item[i]); } else if (seq.empty() ){ return false; } else { char c = seq.top(); seq.pop(); if (c != '(') { return false; } } } return seq.empty(); } void getParenthesis(vector<string>& result, string& subItem, int leftRemain, int rightRemain) { if (leftRemain == 0 && rightRemain == 0) { string item = "(" + subItem + ")"; if (ifNormal(item)) { result.push_back(item); } return; } if (leftRemain != 0) { subItem += "("; getParenthesis(result, subItem, leftRemain-1, rightRemain); subItem.pop_back(); } if (rightRemain != 0) { subItem += ")"; getParenthesis(result, subItem, leftRemain, rightRemain-1); subItem.pop_back(); } } vector<string> generateParenthesis(int n) { vector<string> result; string subItem; getParenthesis(result, subItem, n-1, n-1); return result; }
修改后的代码如下:
vector<string> generateParenthesis(int n) { vector<string> result; string item; dfs(result, item, n, n); return result; } <span style="color:#ff0000;"> /* left and right represents the remaining number of ( and ) that need to be added. When left > right, there are more ")" placed than "(". Such cases are wrong and the method stops. */ </span> void dfs(vector<string>& result, string& item, int left, int right){ if(left > right) return; if(left==0 && right==0){ result.push_back(item); return; } string tmp; if(left>0){ tmp = item + "("; dfs(result, tmp, left-1, right); } if(right>0){ tmp = item + ")"; dfs(result, tmp, left, right-1); } } };
相关文章推荐
- IOS键盘的相关设置(UITextfield)
- 为什么我不推荐大家去外包公司 适合年轻人看顶起
- 黑马程序员-java基础-反射
- 中断类型标志
- 阿里云服务器ftp 的两个问题。让人头痛
- 通过指针访问C++对象的私有成员
- java时间处理工具类--DateUtils
- 微信支付:redirect-uri参数错误 的解决办法
- android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件
- C#查看各种变量的指针地址
- Debug与Release版本的区别 总结
- 图说——JavaIO
- NYOJ 769 乘数密码
- Python 2.7.9 Demo - 019.01.CRUD oracle by cx_Oracle
- 小字典系统
- 功能分析
- 黑马程序员——static关键字
- BZOJ 1013 [JSOI2008]球形空间产生器sphere 【高斯消元】
- bind 启动过程
- Verilog文件读取