【leetcode】22. Generate Parentheses 合法括號串的所有組合

knzeus發表於2019-05-14

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

相關文章