[LeetCode] Generate Parentheses
2013-12-19 21:28
585 查看
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:
class Solution {
public:
vector<string> generateParenthesis(int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(n == 0) {
return vector<string>(1, "");
}
if(n == 1) {
return vector<string>(1, "()");
}
vector<string> left;
vector<string> right;
vector<string> svec;
int i = 0, j = 0, k = 0;
string str;
for(k = n - 1; k >= 0; --k) {
left = generateParenthesis(k);
right = generateParenthesis(n - 1 - k);
for(i = 0; i < left.size(); ++i) {
for(j = 0; j < right.size(); ++j) {
str.clear();
str.append("(");
str.append(left[i]);
str.append(")");
str.append(right[j]);
svec.push_back(str);
}
}
}
return svec;
}
};
再看上面的代码,在求generateParenthesis(n)时要求generateParenthesis(0)到generateParenthesis(n-1),而在求generateParenthesis(n-1)时又要考虑generateParenthesis(0)到generateParenthesis(n-1),这中间有许多重复的问题,虽然没有最优子结构,但是有重复子问题,因此,可以用类似动态规划的方法将已经求解的结果保存起来,当下次再用的时候直接去取就行了,以空间换时间,减少运行时间。
class Solution {
vector<vector<string> > svv;
public:
vector<string> generate(int n)
{
if(!svv
.empty())
return svv
;
if(n == 0)
return vector<string>(1, "");
if(n == 1)
return vector<string>(1, "()");
vector<string> left;
vector<string> right;
vector<string> svec;
int i = 0, j = 0, k = 0;
string str;
for(k = n - 1; k >= 0; --k) {
left = generateParenthesis(k);
right = generateParenthesis(n - 1 - k);
for(i = 0; i < left.size(); ++i) {
for(j = 0; j < right.size(); ++j) {
str.clear();
str.append("(");
str.append(left[i]);
str.append(")");
str.append(right[j]);
svec.push_back(str);
}
}
}
return svec;
}
vector<string> generateParenthesis(int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
svv = vector<vector<string> >(n + 1);
return generate(n);
}
};
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
问题描述:给定一个数字n,写一个函数生成n对括号的有效组合。
碰到这种给定一个数字n的情况,首先看看是否可以通过递归来解。假如已知n - 1对括号的所有有效组合,能否得到n对括号的有效组合呢?
那么,剩下那一对括号如何插入到n - 1对括号的组合中呢?好像不太容易。
将n - 1对括号分成两个部分,一个部分是k对括号的组合,另一个部分是n - 1 - k对括号的组合,将剩下的那对括号对前面的k对括号整个括起来,然后将k取n - 1到0的所有值即可。那么,这样做是否会产生重复的结果呢?当然不会,如果有两种组合加上剩下的那一对括号,最后得到了相同的结果,那么,两种组合的两个部分都应该是一样的,也就是说在k对括号的组合中,有一样的结果,这是一种递归的否定,由于在k对括号中不可能有一样的,因此n对括号的组合也不可能有一样的。
代码部分参考了Generate Parentheses 。
class Solution {
public:
vector<string> generateParenthesis(int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(n == 0) {
return vector<string>(1, "");
}
if(n == 1) {
return vector<string>(1, "()");
}
vector<string> left;
vector<string> right;
vector<string> svec;
int i = 0, j = 0, k = 0;
string str;
for(k = n - 1; k >= 0; --k) {
left = generateParenthesis(k);
right = generateParenthesis(n - 1 - k);
for(i = 0; i < left.size(); ++i) {
for(j = 0; j < right.size(); ++j) {
str.clear();
str.append("(");
str.append(left[i]);
str.append(")");
str.append(right[j]);
svec.push_back(str);
}
}
}
return svec;
}
};
再看上面的代码,在求generateParenthesis(n)时要求generateParenthesis(0)到generateParenthesis(n-1),而在求generateParenthesis(n-1)时又要考虑generateParenthesis(0)到generateParenthesis(n-1),这中间有许多重复的问题,虽然没有最优子结构,但是有重复子问题,因此,可以用类似动态规划的方法将已经求解的结果保存起来,当下次再用的时候直接去取就行了,以空间换时间,减少运行时间。
用一个string的vector的两层嵌套来保存中间结果,如果已经得到了结果就直接获取,如果没有,则计算。
class Solution {
vector<vector<string> > svv;
public:
vector<string> generate(int n)
{
if(!svv
.empty())
return svv
;
if(n == 0)
return vector<string>(1, "");
if(n == 1)
return vector<string>(1, "()");
vector<string> left;
vector<string> right;
vector<string> svec;
int i = 0, j = 0, k = 0;
string str;
for(k = n - 1; k >= 0; --k) {
left = generateParenthesis(k);
right = generateParenthesis(n - 1 - k);
for(i = 0; i < left.size(); ++i) {
for(j = 0; j < right.size(); ++j) {
str.clear();
str.append("(");
str.append(left[i]);
str.append(")");
str.append(right[j]);
svec.push_back(str);
}
}
}
return svec;
}
vector<string> generateParenthesis(int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
svv = vector<vector<string> >(n + 1);
return generate(n);
}
};
相关文章推荐
- LeetCode22——Generate Parentheses(给定n对括号,然后看有多少正确的括号组合)
- 【leetcode】Generate Parentheses
- 【LeetCode】Generate Parentheses 解题报告
- Leetcode-Generate Parentheses
- [Leetcode] 22- Generate Parentheses
- 【leetcode】Generate Parentheses
- LeetCode Generate Parentheses
- [LeetCode]题解(python):022-Generate Parentheses
- Generate Parentheses - LeetCode 22
- [LeetCode][JavaScript]Generate Parentheses
- N-Queens And N-Queens II [LeetCode] + Generate Parentheses[LeetCode] + 回溯法
- Leetcode 22 Generate Parentheses
- Generate Parentheses 【Leetcode】
- leetcode-22 Generate Parentheses
- leetcode-22-Generate Parentheses
- [leetcode] Generate Parentheses
- LeetCode Generate Parentheses DFS或者生产呢排列
- [LeetCode]Generate Parentheses
- Generate Parentheses -- leetcode
- LeetCode 22: Generate Parentheses