427. Generate Parentheses

http://www.lintcode.com/en/problem/generate-parentheses/

这道题给定n,然后输出所有长度为2n的valid parentheses.

解法一:

最简单的解法是枚举,用两个变量num_of_left, num_of_right去track还有多少个左括号和右括号可以使用。只要有左括号可以用就可以继续递归generate,但是只有可用右括号大于左括号时候才可以继续递归generate,防止”)(“的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ret;
        generate(ret, "", n, n);
        return ret;
    }

    void generate(
        vector<string>& ret,
        string s,
        int num_of_left,
        int num_of_right)
    {
        if (num_of_left == 0 && num_of_right == 0)
        {
            ret.push_back(s);
            return;
        }

        if (num_of_left > 0)
        {
            generate(ret, s+"(", num_of_left-1, num_of_right);
        }
        if (num_of_right > num_of_left)
        {
            generate(ret, s+")", num_of_left, num_of_right-1);
        }
    }
};

解法二:

dp的思路 ,想求第f(n),就是将”()“加入f(n-1)的结果:

f(0): “”

f(1): “(“f(0)”)”

f(2): “(“f(0)”)“f(1), ”(“f(1)”)”

f(3): “(“f(0)”)“f(2), ”(“f(1)”)“f(1), ”(“f(2)”)”

所以 f(n) = “(“f(0)”)“f(n-1) , ”(“f(1)”)“f(n-2) ”(“f(2)”)“f(n-3) … ”(“f(i)”)“f(n-1-i) … ”(f(n-1)“)”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<vector<string>> tmp = ;
        for (int j = 1; j <= n; ++j)
        {
            vector<string> vec;
            for (int i = 0; i < j; ++i)
            {
                for (auto fst : tmp[i])
                {
                    for (auto snd : tmp[j-i-1])
                    {
                        vec.push_back("("+fst+")"+snd);
                    }
                }
            }
            tmp.push_back(vec);
        }
        return tmp.back();
    }
};