22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例:

  1. 输入:n = 3
  2. 输出:[
  3. "((()))",
  4. "(()())",
  5. "(())()",
  6. "()(())",
  7. "()()()"
  8. ]

代码实现

  1. /*
  2. 方法一还有改进的余地:我们可以只在序列仍然保持有效时才添加 '(' or ')',而不是像 方法一 那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,
  3. 如果左括号数量不大于 nnn,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。
  4. */
  5. class Solution {
  6. void generate_all(string& current,int leftNums, int rightNums,int n, vector<string>& result) {
  7. if (n*2 == current.size()) {
  8. result.push_back(current);
  9. return;
  10. }
  11. if(leftNums < n){
  12. current += '(';
  13. generate_all(current,leftNums+1,rightNums, n, result);
  14. current.pop_back();
  15. }
  16. if(rightNums < leftNums ){
  17. current += ')';
  18. generate_all(current,leftNums,rightNums+1, n, result);
  19. current.pop_back();
  20. }
  21. }
  22. public:
  23. vector<string> generateParenthesis(int n) {
  24. vector<string> result;
  25. string current;
  26. generate_all(current, 0, 0, n, result);
  27. return result;
  28. }
  29. };