数字n代表生成括号的对数,设计一个函数,用于能够生成所有可能的并且有效的括号组合 回溯算法

题目描述:

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

如   n=2 则输出 // ['(())', '()()']

  n=3 则输出 // ['((()))', '(()())', '(())()', '()(())', '()()()']

解题思路:

1.首先每个括号是成对的一个左括号和右括号两个元素组成,有效的括号即左右括号要对应

2.每放置一个左括号,便可以放置一个右括号,并且在左括号数量小于 n 时依然可以放置左括号

——左括号数量不大于 n 时可以添加左括号

——左括号数量大于右括号时可以添加右括号

3.定一个数组容器放生成的组合字符串,用初始化空字符串来写入括号

4.边界条件是左右括号数量和达到 2*n 时把字符串push()进容器数组

let generateParent = function(n){ 
    let res = []
    let handleParen = (cur, left, right) =>{
        if(cur.length === 2*n) { // 满足条件时结束递归调用
            res.push(cur)
            return
        }
        if(left < n) { // 进入到这个条件的同时并不会阻塞下面的条件语句,也就是另外一种可能
            handleParen(cur+"(", left +1 , right)
        }
        if(left > right) {
            handleParen(cur + ')', left, right+1)
        }
    } 
    handleParen('',0,0) // 设置一个初始状态
    return res
}
console.log(generateParent(3), 'generateParent')

 

在这里正好普及下回溯算法

回溯算法,也是算法设计中的一种思想,是一种渐进式寻找并构建问题解决方式的策略

回溯算法会先从一个可能的工作开始解决问题,如果不行,就回溯并选择另一个动作,直到将问题解决

使用回溯算法的问题,有如下特性:

  • 有很多路,例如一个矩阵的方向或者树的路径
  • 在这些的路里面,有死路也有生路,思路即不符合题目要求的路,生路则符合
  • 通常使用递归来模拟所有的路
posted @ 2022-11-04 22:37  逸然一生  阅读(357)  评论(0编辑  收藏  举报