Problem:
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
这是一个卡特兰数问题。
f(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+f(n-1)*f(0)
要得到f(n),首先按序生成f(0)到f(n-1)。
添加括号的方式如下:
f(0)=""
f(1)="("f(0)")"*f(0)
f(2)="("f(0)")"*f(1)+"("f(1)")"*f(0)
...
Solution:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector< vector<string> > vv(n);
vv.clear();
vector<string> tmp;
for(int i=0;i<=n;i++)
{
tmp.clear();
if(i==0)
tmp.push_back("");
for(int j=0;j<i;j++)
{
for(int k=0;k<vv.at(j).size();k++)
{
for(int l=0;l<vv.at(i-j-1).size();l++)
{
string str(vv.at(j).at(k));
str.insert(0,"(");
str.append(")");
str.append(vv.at(i-j-1).at(l));
tmp.push_back(str);
}
}
}
vv.push_back(tmp);
}
return vv.at(n);
}
};
public:
vector<string> generateParenthesis(int n) {
vector< vector<string> > vv(n);
vv.clear();
vector<string> tmp;
for(int i=0;i<=n;i++)
{
tmp.clear();
if(i==0)
tmp.push_back("");
for(int j=0;j<i;j++)
{
for(int k=0;k<vv.at(j).size();k++)
{
for(int l=0;l<vv.at(i-j-1).size();l++)
{
string str(vv.at(j).at(k));
str.insert(0,"(");
str.append(")");
str.append(vv.at(i-j-1).at(l));
tmp.push_back(str);
}
}
}
vv.push_back(tmp);
}
return vv.at(n);
}
};