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的时候程序执行过程。