训练题:有效括号组合
题目:https://leetcode-cn.com/problems/generate-parentheses/
排列组合首先想到回溯算法。
vector<string> generateParenthesis(int n) {
if(n == 1) return {"()"};
vector<string> ret;
string str("(");
str.reserve(n<<1);
int left = 1, right = 0;
backtrack(ret, str, left, right, n);
return ret;
}
// 使用引用,减少中间变量
// left: str中(的数量
// right: str中)的数量
// maxCount: 括号对数
void backtrack(vector<string>& vec, string& str, int& left, int& right, const int& maxCount){
if(left == maxCount && right == maxCount){
vec.push_back(str);
return;
}
// 左括号(已经用完,往后全都必须是右括号,单独拿出来处理,减少递归深度。
if(left == maxCount) {
int tmp = maxCount - right;
str.append(tmp, ')'); // 补齐剩下的括号
vec.push_back(str);
str.resize(str.size()-tmp); // 恢复到补齐之前的内容
return;
}
// 左括号还没有满的时候,就可以添加左括号
if(left < maxCount) {
str.push_back('(');
select(vec, str, ++left, right, maxCount);
str.pop_back();
--left;
}
// 右括号比左括号少的时候,就可以添加右括号
if(right < left) {
str.push_back(')');
select(vec, str, left, ++right, maxCount);
str.pop_back();
--right;
}
}