描述:

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
 "((()))",
 "(()())",
 "(())()",
 "()(())",
 "()()()"
]

我的老实人+不择手段算法:

let cache = {};
var generateParenthesis = function(n) {
   暴力枚举
      if(n==1){
        return ['()'];
    }
    if(cache[n])
        return cache[n];
    let start = '',result = [];
    for(let i = 0; i < n; i++){
        start +='()';
    }
    result.push(start);
    for(let i = 1,l=start.length; i < n;i++){
        let move = generateParenthesis(start.slice(0,i*2).length /2),
            holdOn = generateParenthesis(start.slice(i*2).length/2);
            
        move.forEach((item)=>{
                holdOn.forEach((holdOn) => {
                    for( let j = 0,subLength = holdOn.length; j < subLength; j += 2){
                        result.push( holdOn.slice(0,j+1) + item + holdOn.slice(j+1) )
                    }
                })
            
        })
            
    }
    for(let i = 0,l=result.length; i < l; i++){
        if(result.indexOf(result[i])!==result.lastIndexOf(result[i])){
            result.splice(i,1);
            i--;
        }
    }
    cache[n] = result;
    return result;
 }

思路:给定n对括号,可以先构造一个模板,然后在这个模板中,通过移动左边1,2,...,n-1 个括号到右边的括号里面,这样就可以构造出所有可能的有效序列了,

比分说: n = 3, 那么我们可以先构造出一个模板 ()()(),而后通过移动左边的1,2个括号到右边的2,1个括号构成的序列的括号里边的位置,那么就可以构造出其他有效序列了,而这里边必须注意的是移动左边的括号往右边的括号里边放的时候,左右两个子序列也会有各自的排序方法,所以需要递归的先求出左右序列的所有排列可能,而后再进行插入操作。

事情还没完,这样左右两边都列出可能的排列之后,肯定会发生重复,所以最后我又进行了一个数组去重,真是不可原谅,最后提交的时候抛出了308ms惊人的成绩。这还是在用了cache缓存一定子序列的情况下跑的。

然后要着重贴一下官方的解答下面的一个递归算法,

var generateParenthesis = function(n) {
     /* 保持 左右平衡 */
    let result = [],
        
        produce = (curStr,left,right,curNums) => {
            if( (left == curNums )&& (right == curNums) ){
                result.push(curStr);
                return;
            }
            
            if( left < curNums){
                produce(curStr+'(',left +1 ,right,curNums);
            }
            if( right < left){
                produce(curStr+')',left,right+1,curNums);
            }
        };
        
    produce('',0,0,n);
    
    return result;
};

这个算法其实更暴力,妙在使用递归和保持左右括号平衡的方法将一个看似复杂的问题简化了,我们走一遍流程哈,假如 n = 3对,刚开始 肯定是左半边括号加,

然后进入递归

此时left为1,继续

此时left为2,继续

此时left为3了,右半括号开始加,

此时right为1,继续

此时right为2,继续递归

此时right为3,

result里边push进((()))

最后一层函数返回

倒数第二层返回,直到返回到left为2时的状态

进入到 第三个if里边,这时候 curStr = ((),继续递归

......

直到结束。

我是真的觉得这个算法很妙,确实很钦佩第一个想出此种算法的人,妙极!因为递归,所以函数上下文可以保留函数的环境,也就是保存了‘(’和‘)’的各种排列,并且是平衡的,只要平衡(即左右括号数列相等)就是有效的。

高手高手!

22. Generate Parentheses--求n对括号组成可以组成的全部有效括号序列的更多相关文章

  1. [Leetcode][Python]22: Generate Parentheses

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 22: Generate Parentheseshttps://oj.leet ...

  2. 刷题22. Generate Parentheses

    一.题目说明 这个题目是22. Generate Parentheses,简单来说,输入一个数字n,输出n对匹配的小括号. 简单考虑了一下,n=0,输出"";n=1,输出" ...

  3. 22. Generate Parentheses(ML)

    22. Generate Parentheses . Generate Parentheses Given n pairs of parentheses, write a function to ge ...

  4. [LeetCode]22. Generate Parentheses括号生成

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  5. 22.Generate Parentheses[M]括号生成

    题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...

  6. LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)

    题目链接 : https://leetcode.com/problems/generate-parentheses/?tab=Description   给一个整数n,找到所有合法的 () pairs ...

  7. 22. Generate Parentheses生成指定个括号

    生成指定个数的括号,这些括号可以相互包括,但是一对括号的格式不能乱(就是配对的一个括号的左括号要在左边,右括号要在右边) 思维就是从头递归的添加,弄清楚什么时候要添加左括号,什么时候添加右括号 有点像 ...

  8. LeetCode OJ 22. Generate Parentheses

    题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...

  9. 【LeetCode】22. Generate Parentheses (2 solutions)

    Generate Parentheses Given n pairs of parentheses, write a function to generate all combinations of ...

  10. 22. Generate Parentheses (recursion algorithm)

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

随机推荐

  1. 多语言越狱很棒!😊MULTILINGUAL JAILBREAK CHALLENGES IN🧜‍♀️LARGE LANGUAGE MODELS

    写这篇的时候第一次认识到了附录内容的重要性(bushi只是这篇读了全部的附录),它可以让你明确文章全部的实验,并且其中包含很多辅助你对正文理解的表格 禁止盗用,侵权必究!!!欢迎大家积极举报

  2. 即时通讯技术文集(第43期):直播技术合集(Part3) [共13篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 43 期. [-1-] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术实践 ...

  3. IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<上网慢?经常掉线?这篇文章告诉你该怎么办!>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注 ...

  4. OpenMMLab AI实战营 第一课笔记

    OpenMMLab AI实战营 第一课笔记 OpenMMLab AI实战营第一节课由子豪兄讲解,课程主要内容主要围绕计算机视觉和OpenMMLab开源算法体系以及机器学习和神经网络简介进行展开.这里要 ...

  5. P1437 敲砖块 题解

    题意 在一个凹槽中放置了 \(n\) 层砖块.最上面的一层有 \(n\) 块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示: 14 15 4 3 23 3 ...

  6. 更改高通xbl串口log波特率

    本修改基于高通QCM6125平台,目的是为了满足客户无聊的需求. 注意事项: 基准时钟频率需要是硬件和驱动支持的频率,时钟频率和分频系数可以从AP侧驱动中找到 最低分频系数需要满足分频公式(能够被整除 ...

  7. 2020-2024 IDEA安装+激活

    一.下载 1. IDEA各版本官方下载入口 IDEA官网下载地址 2. 选择左边,然后点击[20xx.x.x-Windows(exe)] PS: 如需下载特定版本,可以往下拉,都是选择[202x.x- ...

  8. Index - 此处的诗

    虚构往事 正篇   嗯--本来发过两篇,但深愧于仓促的处理和并未完善的细节设定,隐藏了.   大概会是一个中篇的科幻故事,世界设定已经完善了(Shaya 可以作证!),但近期可能没有精力动笔. 番外 ...

  9. RestTemplate 详解

    RestTemplate 简介 RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求.POST 请求.PUT ...

  10. Java API 之集合

    1. 包装类 (基本类型中没有多少我们能够使用的方法和属性,为了便捷我们需要自己去写) 针对每一种基本类型提供了对应的类的形式 --- 包装类   byte short int long float ...