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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思路:深度优先搜索(DFS)。
总结一个小经验,凡是看到答案是多个组合的情况,一般想到回溯法递归求解。
在这里,针对括号匹配问题,比较巧妙的是,动态维护两个变量,一个是左括号的个数n,一个是右括号的个数m。
每放一个左括号,左括号的个数就减1(初始化有n个左括号),所需右括号的个数就加1(初始化有0个右括号),每放一个右括号,右括号的个数就减1,直到最后左右括号个数都为0,返回一次搜索结果。
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string>res;
dfs(res,"",n,0);
return res;
}
void dfs(vector<string>&res,string path,int n,int m){
if(n==0&m==0){
res.push_back(path);
return;
}
if(n>0){
dfs(res,path+"(",n-1,m+1);
}
if(m>0){
dfs(res,path+")",n,m-1);
}
}
};