题目:https://leetcode-cn.com/problems/generate-parentheses/
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
样例输入与输出:
n = 3
输出:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
- 不难想出直接暴力的做法,每个位置上有"("和")"两种选择,总共有2^n种情况。但可以进行优化,因为第一个括号一定是"(",并且只有在有"("时才能放置")",因此记录左括号的个数,每放一个右括号,左括号的数目减1,当左括号数目为0时,下一位置不能放置右括号。
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
string str; str.resize(2*n);
dfs(0, n, str, ans, 0);
return ans;
}
private:
void dfs(int idx, int n, string& str, vector<string>& ans, int l){
if(idx == 2*n){
if(l == 0){
ans.push_back(str);
}
return;
}
str[idx] = '('; dfs(idx+1, n, str, ans, l+1);
if(l)
{str[idx] = ')'; dfs(idx+1, n, str, ans, l-1); }
}
};
- 另一种搜索策略,参考 https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 左右括号的个数必定分别为n,以左右括号剩余个数作为状态,搜索策略是:1)当还有左右括号时才能产生分支 2)只要左括号个数大于0,就可以产生左分支 3)产生右分支时,只有右括号个数严格大于左括号个数时才能产生分支。