【LeetCode-字符串】括号生成

题目描述

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

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

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

思路

使用递归+回溯来做。递归中先放左括号'(',当右括号')'的个数小于左括号的个数时才能放右括号。代码如下:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        if(n<1){
            return ans;
        }

        int left = 0, right = 0;   // 当前左括号、右括号的个数 
        generate(ans, "", left, right, n);
        return ans;
    }

    void generate(vector<string>& ans, string curStr, int left, int right, int n){
        if(curStr.length()==n*2){
            ans.push_back(curStr);
            return;
        }

        if(left<n){
            curStr += "(";
            generate(ans, curStr, left+1, right, n);
            curStr.pop_back();    // 将字符串最后一位删掉
        }
        if(right<left){    // 注意这个条件
            curStr += ")";
            generate(ans, curStr, left, right+1, n);
            curStr.pop_back();    //将字符串最后一位删掉
        }
    }
};
  • 时间复杂度:\(O(\frac{4^n}{\sqrt{n}})\)
  • 空间复杂度:O(n)
    每一层递归需要O(1)的空间复杂度,最多递归2n层,所以空间复杂度为O(n)。
posted @ 2020-04-11 20:23  Flix  阅读(176)  评论(0编辑  收藏  举报