递归:
vector<string> generateParenthesis(int n) {
vector<string> res;
generate(n,n,res,"");
return res;
}
void generate(int l, int r, vector<string>& res, string s)
{
if (l > r) return;
if (l == 0)
{
for (int i = 0; i < r; i++) s+= ")";
res.push_back(s);
return;
}
generate(l - 1, r, res, s + "(");
generate(l, r - 1, res, s + ")");
}循环:向最后一个左括号之后的所有位置插入'(' + 剩余内容 +')'
vector<string> generateParenthesis(int n) {
vector<string> res;
vector<string> temp;
res.push_back("");
for(int i = 0; i < n; i++)
{
for(int j = 0; j < res.size(); j++)
{
int pos = res[j].rfind("(");
for(int k = pos + 1; k <= res[j].size(); k++)
{
temp.push_back( res[j].substr(0, k) + "(" + res[j].substr(k) + ")");
}
}
res = temp;
temp.clear();
}
return res;
}DP:
dp(i):i对括号的所有可能的排列
dp(i) = 对所有的j < i : dp(j) + '(' + dp(i - j - 1) + ')'
vector<string> generateParenthesis(int n) {
vector<vector<string>> res(n + 1);
res[0] = vector<string>();
res[0].push_back("");
for(int i = 1; i <= n; i++)
{
vector<string> cur;
for(int j = 0; j < i; j++)
{
for(int l = 0; l < res[j].size(); l++)
for(int r = 0; r < res[i - j - 1].size(); r++)
cur.push_back(res[j][l] + "(" + res[i - j - 1][r] + ")" );
}
res[i] = cur;
}
return res[n];
}
本文介绍三种不同的算法实现来生成所有有效的括号组合:递归、循环及动态规划方法。每种方法都通过具体的代码示例进行了说明。
2074

被折叠的 条评论
为什么被折叠?



