训练题:有效括号组合

题目:https://leetcode-cn.com/problems/generate-parentheses/

排列组合首先想到回溯算法。

  1. vector<string> generateParenthesis(int n) {
  2. if(n == 1) return {"()"};
  3. vector<string> ret;
  4. string str("(");
  5. str.reserve(n<<1);
  6. int left = 1, right = 0;
  7. backtrack(ret, str, left, right, n);
  8. return ret;
  9. }
  10. // 使用引用,减少中间变量
  11. // left: str中(的数量
  12. // right: str中)的数量
  13. // maxCount: 括号对数
  14. void backtrack(vector<string>& vec, string& str, int& left, int& right, const int& maxCount){
  15. if(left == maxCount && right == maxCount){
  16. vec.push_back(str);
  17. return;
  18. }
  19. // 左括号(已经用完,往后全都必须是右括号,单独拿出来处理,减少递归深度。
  20. if(left == maxCount) {
  21. int tmp = maxCount - right;
  22. str.append(tmp, ')'); // 补齐剩下的括号
  23. vec.push_back(str);
  24. str.resize(str.size()-tmp); // 恢复到补齐之前的内容
  25. return;
  26. }
  27. // 左括号还没有满的时候,就可以添加左括号
  28. if(left < maxCount) {
  29. str.push_back('(');
  30. select(vec, str, ++left, right, maxCount);
  31. str.pop_back();
  32. --left;
  33. }
  34. // 右括号比左括号少的时候,就可以添加右括号
  35. if(right < left) {
  36. str.push_back(')');
  37. select(vec, str, left, ++right, maxCount);
  38. str.pop_back();
  39. --right;
  40. }
  41. }

训练题:数字组合

语雀内容

训练题:1到n(全排列)

语雀内容

训练题:字符串排列

语雀内容