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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
首先这种类型的题目一眼看上去肯定是可以用递归的形式,递归的写法往往是一看就懂,写起来就有点无从下手,这次能比较快速的写出来是因为前几天项目里刚好写过类似的函数。

递归方法

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        addingpar(res, "", n, 0);
        return res;
    }
    void addingpar(vector<string> &v, string str, int n, int m){
        if(n==0 && m==0) {
            v.push_back(str);
            return;
        }
        if(m > 0){ addingpar(v, str+")", n, m-1); }
        if(n > 0){ addingpar(v, str+"(", n-1, m+1); }
    }
};

这里的递归与平时有点不同,在递归中添加了条件,通过m记录还有多少个右括号需要添加,递归开始时m为0.
这里执行的情况如下:

Runtime: 8 ms, faster than 51.24% of C++ online submissions for Generate Parentheses.
Memory Usage: 15 MB, less than 80.17% of C++ online submissions for Generate Parentheses.

DFS

与递归实现比起来DFS居然有点难以理解,乍一看这不就是上面的递归解法吗,但程序的执行方式差异较大,主要的区别在dfs函数中当我们计算出来答案后向res中添加了答案后没有退出。

vector<string> generateParenthesis(int n) {
    vector<string> res;
    dfs("", n, n, res);
    return res;
}
void dfs(string s, int opens, int closes, vector<string> &res) {
    if(!opens && !closes) res.push_back(s);
    if(opens) dfs(s + '(', opens - 1, closes, res);
    if(opens < closes) dfs(s + ')', opens, closes - 1, res);
}

DFS解法相对于递归方法难以理解,可以观察当n等于1 2 3的时候程序执行过程。