22. Generate Parentheses
来源:互联网 发布:外交 知乎 编辑:程序博客网 时间:2024/04/30 04:20
这道题目,我是通过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); } }};
0 0
- [LeetCode]22.Generate Parentheses
- LeetCode --- 22. Generate Parentheses
- LeetCode 22.Generate Parentheses
- [Leetcode] 22. Generate Parentheses
- 【LeetCode】22.Generate Parentheses
- 22. Generate Parentheses
- [leetcode] 22.Generate Parentheses
- 【leetcode】22. Generate Parentheses
- Leetcode-22.Generate Parentheses
- [leetcode] 22. Generate Parentheses
- 22. Generate Parentheses
- 22. Generate Parentheses
- 22. Generate Parentheses LeetCode
- 22. Generate Parentheses
- leetcode 22. Generate Parentheses
- 22. Generate Parentheses
- [LeetCode]22. Generate Parentheses
- 22. Generate Parentheses
- Debug与Release版本的区别 总结
- [web安全] 基本概念(持续更新)
- 中断类型标志
- 黑马程序员-java基础-反射
- tcpdump一些选项的使用
- 22. Generate Parentheses
- 成员变量和局部变量的区别
- 图书管理源程序
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单示例
- 面试题29:数组中出现次数超过一半的数字
- 格式化输出
- what is ELM
- 147.统计各年龄段人数
- java时间处理工具类--DateUtils