您的位置:首页 > 新闻 > 热点要闻 > 力扣题/回溯/括号生成

力扣题/回溯/括号生成

2025/2/25 7:06:17 来源:https://blog.csdn.net/weixin_41895625/article/details/141812144  浏览:    关键词:力扣题/回溯/括号生成

括号生成

力扣原题

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

示例 1:

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

示例 2:

输入:n = 1
输出:["()"]

/*** @param {number} n* @return {string[]}*/
var generateParenthesis = function(n) {const res = []function valid(arr) {let balance = 0;for(const char of arr) {// 左右括号数量匹配if(char === '(') {balance += 1} else {balance -= 1}// 如果遍历过程中,右括号不可能大于左括号,否则一定是无效的匹配if(balance < 0) {return false}}return balance === 0}function dfs(i = 0, arr = [], leftCount = 0, rightCount = 0) {// 左括号超出范围if(leftCount > n) {return}// 右括号超过左括号,无效if(rightCount > leftCount) {return}if(arr.length === n * 2) {// 验证是否有效if(valid(arr)) {res.push(arr.join(''))}return}dfs(i+1, [...arr, '('], leftCount + 1, rightCount)dfs(i+1, [...arr, ')'], leftCount, rightCount + 1)}dfs()return res
};

解题思路

  1. 使用dfs
  2. 在每一个位置i,都分别添加()
  3. 直到数组长度等于n * 2,此时是一个组合,使用valid函数去判断左右括号数量是否匹配,匹配则左右括号数量相等,即balance === 0,此时为一个有效的组合
  4. 进一步优化,在dfs过程中,记录左右括号数量,如果左括号数量超过n右括号数量超过左括号数量,则停止遍历

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com