原题地址:https://leetcode-cn.com/problems/generate-parentheses/submissions/
题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题方案:
最近做动态规划做得很不顺。。所以想做一段时间回溯(感觉也很不顺啊好难啊Q~Q)。写的过程中出现了很多c++使用不熟练的问题,比如vector<char>转string。
递归条件:
结束条件:左右括号的个数均为0;
递归条件1:右括号数量大于左括号数量,即可以加入一个右括号;
递归条件2:左括号大于0,即可以加入一个左括号。
状态恢复:子串中加入的字符出栈
递归函数参数:
局部变量:暂存的子串
全局变量:结果字符串
结束条件:左右括号个数
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<char> sublist;
vector<string> result;
int left = n, right = n;
choose(left, right, sublist, result);
return result;
}
void choose(int left, int right, vector<char> sublist, vector<string> &result)
{
if(left == 0 && right == 0)
{
string re;
for(int i = 0; i < sublist.size(); i ++)
// re.insert(re.end(), sublist[i]);
re += sublist[i];
sublist.erase(sublist.begin(), sublist.end());
result.push_back(re);
}
if(right > left)
{
sublist.push_back(')');
choose(left, right - 1, sublist, result);
sublist.pop_back();
}
if(left > 0)
{
sublist.push_back('(');
choose(left - 1, right, sublist, result);
sublist.pop_back();
}
}
};