zoukankan      html  css  js  c++  java
  • 【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)。
  • 相关阅读:
    日期时间工具(dayjs)的使用
    Apache JMeter下载使用
    webpack 干货总结
    常见设计模式——模板方法
    常见设计模式——代理模式
    Codeforces Round #340 (Div. 2)E
    HDU 4547
    HDU 2586
    LCA算法的介绍与模板
    1073. 负二进制数相加
  • 原文地址:https://www.cnblogs.com/flix/p/12681992.html
Copyright © 2011-2022 走看看