[LeetCode系列]括号生成问题
2014-08-14 16:37
309 查看
给定n, 返回所有匹配的n对括号的可能形式. 如
给定 n = 3, 一个解集是:
本题解法的思路是
使用栈seq保存经历的字符串状态;
使用栈valid保存对应的字符串中有效的括号对个数;
当seq不为空时(即回溯未结束):
当前的字符串和其中有效的括号对个数分别出栈;
1. 如果字符串长度等于待求解的长度, 则将其加答案中;
2. 如果字符串长度-有效括号对数小于最大括号对个数, 说明可以增加一个 "("; [有效括号对数代表已经放置的")", 这个差值代表已经放置的"("个数]
3. 如果字符串长度大于成对的括号数, 说明需要加一个 ")", 并且有效括号对需要增加1; [说明有未配对的"("]
给定 n = 3, 一个解集是:
"((()))", "(()())", "(())()", "()(())", "()()()"
本题解法的思路是
使用栈seq保存经历的字符串状态;
使用栈valid保存对应的字符串中有效的括号对个数;
当seq不为空时(即回溯未结束):
当前的字符串和其中有效的括号对个数分别出栈;
1. 如果字符串长度等于待求解的长度, 则将其加答案中;
2. 如果字符串长度-有效括号对数小于最大括号对个数, 说明可以增加一个 "("; [有效括号对数代表已经放置的")", 这个差值代表已经放置的"("个数]
3. 如果字符串长度大于成对的括号数, 说明需要加一个 ")", 并且有效括号对需要增加1; [说明有未配对的"("]
class Solution { public: vector<string> generateParenthesis(int n) { if (n == 0) return vector<string> (0); stack<string> seq; stack<int> valid; vector<string> ans; seq.push("("); valid.push(0); while (!seq.empty()) { string s = seq.top(); seq.pop(); int v = valid.top(); valid.pop(); if (s.length() == 2 * n) { ans.push_back(s); continue; } if (s.length() - v < n) { seq.push(s + "("); valid.push(v); } if (v * 2 < s.length()) { seq.push(s + ")"); valid.push(v+1); } } return ans; } };
相关文章推荐
- “全排列”问题系列(一)[LeetCode] - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- [LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- WPF开发中遇到的问题及解决系列(二):如何获取通过binding生成的ComboBox或者ListBox等的Item
- LeetCode 笔记系列 14 N-Queen II [思考的深度问题]
- [LeetCode系列]组合和枚举问题
- [LeetCode系列] 变序词查找问题(Anagrams)
- [LeetCode系列] 跳跃问题II
- Excel开发系列二 解决.net生成Excel文件速度问题的若干方案
- [LeetCode] Generate Parentheses 生成括号
- [LeetCode系列]子集枚举问题[无重复元素]
- [LeetCode系列]3元素最近和问题的O(n^2)解法
- [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence
- leetcode 括号匹配系列
- LeetCode | Generate Parentheses(生成括号)
- 分配糖果问题——Leetcode系列(十五)
- [LeetCode系列]子集枚举问题[有重复元素]
- leetcode: 2Sum/3Sum/3SumClosest/4Sum系列问题
- 子集系列(一) 传统subset 问题,例 [LeetCode] Subset, Subset II, Bloomberg 的一道面试题
- [LeetCode系列]爬梯问题的递归解法转换为迭代解法
- [LeetCode系列]BST有效性确定问题[前序遍历]