训练题:有效括号组合
题目: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;}}
