数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
动态规划求解:
class Solution {
public:
void getAns(string str, int l, int r, vector<string>& ans){
if(l == 0 && r == 0)//可插入的左括号和右括号的数目
ans.push_back(str);
if(l > 0)
getAns(str + "(", l - 1, r + 1, ans);
if(r > 0)
getAns(str + ")", l, r - 1, ans);
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
getAns("", n, 0, ans);
return ans;
}
};
深度优先求解:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
dfs(res, "", n, n);
return res;
}
void dfs(vector<string> & res, string str,int left,int right)
{
if(left == 0 && right == 0) res.push_back(str);
if(left > 0) dfs(res, str + "(", left - 1, right);
if(right > left) dfs(res, str + ")", left, right - 1);
}
};