1. 题目
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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
2. 思路
经典的卡特兰数列问题,参考百度百科:http://baike.baidu.com/view/2…
N个括号编号为1~N,等同于所有的出栈、进栈序列种类。
用F(N)标识N个括号的种类数量。假设最后出栈的括号是第k个,k可以使1~N的任意一个,彼此是独立的。
如果第k个最后出来,则所有的形式是 {k-1个括号的所有组合}({N-k个括号的所有组合}),即前k-1个括号肯定在第k个括号前面。后面N-k个括号在第k个括号里面。
所以,F(N) = sum {F(k-1)*F(N-k)}, for k = 1..N
F(0)=1, F(1)=1.
对于这个问题,则可以用递归的方式来得到所有串。
V[1] = {“()”}, V[0] = {“”}
V[N] = {V[k-1]} *( {V[N-k]}), for k=1,N
3. 代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ret;
if (n <= 0) return ret;
if (n == 1) {
ret.push_back("()");
return ret;
}
for (int i = 0; i < n; i++) {
vector<string> v1 = generateParenthesis(i);
vector<string> v2 = generateParenthesis(n - i - 1);
if (i == 0) {
for (int k = 0; k < v2.size(); k++) {
ret.push_back("(" + v2[k] + ")");
}
} else if (i == n - 1) {
for (int j = 0; j < v1.size(); j++) {
ret.push_back(v1[j] + "()");
}
} else {
for (int j = 0; j < v1.size(); j++) {
string s = v1[j];
for (int k = 0; k < v2.size(); k++) {
ret.push_back(s + "(" + v2[k] + ")");
}
}
}
}
return ret;
}
};