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;
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书